functional programming in scala reading #2
TRANSCRIPT
Functional Programming in Scala Reading #2Sep 19 2013
Naoyuki YamadaSoftware Engineer@AMoAdhttps://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")
Chapter2Getting 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”の訳
• これらの原則は大規模なプログラミングでも同じ