Functional Programming in
Scala Reading #2
Sep 19 2013
NaoyukiYamada
Software Engineer@AMoAd
https://github.com/chokkoyamada
• Functional Programming in Scala
(by Paul Chiusano and Rúnar Bjarnason)
の読書会
http://www.manning.com/bjarnason/
• 毎週木曜日17:00~18:00@渋谷マークシティ
• AMoAdの社内勉強会
• 今回は第2回。第1回の資料はこちら
https://speakerdeck.com/potix2/fpscala-chapter1
これは何?
開発環境構築(1/2)
• 書籍用のレポジトリをcloneしてくる
https://github.com/pchiusano/fpinscala
• IntelliJ Idea
+ scala plugin
+ sbt plugin
+ sbt-idea(https://github.com/mpeltonen/sbt-idea)
• chmod a+x ./sbt //実行権限付与
• ./sbt //初回にsbtがセットアップされる
開発環境構築(2/2)
• sbt-ideaプラグインをプロジェクトに追加
#project/plugins.sbtに下記を記述
• ./sbt gen-idea //IntelliJ用のファイルを生成
• IntelliJ Ideaでプロジェクトを開く
• 任意のコードのデモはIntelliJの中の
Scala Worksheetを使います
addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.5.1")
Chapter2
Getting Started
2.1 Introduction
• Scalaと関数型プログラミングの導入
• Scalaの実際のコードをみていく
• 高階関数(higher-order functions: 関数を引
数や戻り値にする関数)の紹介
Chapter 2の概要
2.2 An Example Scala Program
• MyModuleというサンプルコードの説明
• Scalaの特徴(一部)
objectはシングルトンオブジェクトでclassとは
別。その代わりJavaと違ってstaticはない
戻り値の型は省略可能
unit型≒void
valで宣言した変数はimmutable
2.3 Running Our Program
• scalac hoge.scalaでコンパイルしてscala
hogeで実行
• scala hoge.scalaで直接実行もできる
• REPLで:loadで読み込んで実行するやり
方もある
2.4 Modules, objects and
namespaces
• モジュールやネームスペースはJavaとほ
とんど同じ
• 違うところ
Primitive型はなく、全てがオブジェクト
“+” “%”などはoperatorではなくmethod
2.5 Function objects: passing
functions to functions
• 再帰(recursion)について
• tail call optimization(末尾呼び出しの最適化)
→必要なら@annotation.tailrec
• 高階関数の簡単な例:formatResult()
Exercise 1
• n個目のフィボナッチ数を求める関数を
書け。最初の2つの数は0と1。ローカル
関数の末尾再帰を使うこと。
def fib(n: Int): Int
2.6 Polymorphic functions:
abstracting over types
• Polymorphic function(ポリモーフィック/
多相型関数, 別名generic function)は1つだ
けでなく多くの型に対して使える関数
• 型パラメータの機能を使う
→Javaのジェネリックに相当(少し違う)
2.7 Anonymous functions
• Anonymous function(無名関数)について
→a.k.a. lambda
• ‘(引数) => 関数の中身’ という形式で記述
Exercise 2
• isSorted関数を実装しなさい。次のよう
な比較関数を使ってArray[A]がソートさ
れているかどうかチェックすること。
def isSorted[A](as: Array[A], gt: (A, A) => Boolean): Boolean
2.8 Following types to
implementations
• 部分適用(partial application)
複数の引数を取る関数の一部だけに実
引数を適用する操作のこと(Wikipedia)
def partial1[A,B,C](a: A, f: (A,B) => C): B => C =
(b: B) => f(a, b)
→この場合 aというA型の引数が与えられるとB型
を引数にとってC型を返す関数が一意に定義できる
Exercise 3
• 2つの引数を持つ関数fを、1つの引数を
とってfに部分的に適用する変換を行う
カリー化をしなさい。
def curry[A, B, C](f: (A, B) => C): A => (B => C)
Exercise 4
• uncurry化をしなさい。
def uncurry[A, B, C](f: A => B => C): (A, B) => C
Exercise 5
• 次の2つの関数を組み立てる高階関数を
定義しなさい。
def compose[A, B, C](f: B => C, g: A => B): A => C
2.9 Conclusion
• 関数型プログラミングの基本をさらった
• 再帰、高階関数、ポリモーフィック関数
• 正確な実装は型に従って導かれる
→ “follow the types to the collect implementation”の訳
• これらの原則は大規模なプログラミングでも同じ

Functional Programming in Scala Reading #2