Functional Programming in Scala Reading #2

1,393 views

Published on

Published in: Technology
  • Be the first to comment

Functional Programming in Scala Reading #2

  1. 1. Functional Programming in Scala Reading #2 Sep 19 2013 NaoyukiYamada Software Engineer@AMoAd https://github.com/chokkoyamada
  2. 2. • 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 これは何?
  3. 3. 開発環境構築(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がセットアップされる
  4. 4. 開発環境構築(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")
  5. 5. Chapter2 Getting Started
  6. 6. 2.1 Introduction • Scalaと関数型プログラミングの導入 • Scalaの実際のコードをみていく • 高階関数(higher-order functions: 関数を引 数や戻り値にする関数)の紹介 Chapter 2の概要
  7. 7. 2.2 An Example Scala Program • MyModuleというサンプルコードの説明 • Scalaの特徴(一部) objectはシングルトンオブジェクトでclassとは 別。その代わりJavaと違ってstaticはない 戻り値の型は省略可能 unit型≒void valで宣言した変数はimmutable
  8. 8. 2.3 Running Our Program • scalac hoge.scalaでコンパイルしてscala hogeで実行 • scala hoge.scalaで直接実行もできる • REPLで:loadで読み込んで実行するやり 方もある
  9. 9. 2.4 Modules, objects and namespaces • モジュールやネームスペースはJavaとほ とんど同じ • 違うところ Primitive型はなく、全てがオブジェクト “+” “%”などはoperatorではなくmethod
  10. 10. 2.5 Function objects: passing functions to functions • 再帰(recursion)について • tail call optimization(末尾呼び出しの最適化) →必要なら@annotation.tailrec • 高階関数の簡単な例:formatResult()
  11. 11. Exercise 1 • n個目のフィボナッチ数を求める関数を 書け。最初の2つの数は0と1。ローカル 関数の末尾再帰を使うこと。 def fib(n: Int): Int
  12. 12. 2.6 Polymorphic functions: abstracting over types • Polymorphic function(ポリモーフィック/ 多相型関数, 別名generic function)は1つだ けでなく多くの型に対して使える関数 • 型パラメータの機能を使う →Javaのジェネリックに相当(少し違う)
  13. 13. 2.7 Anonymous functions • Anonymous function(無名関数)について →a.k.a. lambda • ‘(引数) => 関数の中身’ という形式で記述
  14. 14. Exercise 2 • isSorted関数を実装しなさい。次のよう な比較関数を使ってArray[A]がソートさ れているかどうかチェックすること。 def isSorted[A](as: Array[A], gt: (A, A) => Boolean): Boolean
  15. 15. 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型を返す関数が一意に定義できる
  16. 16. Exercise 3 • 2つの引数を持つ関数fを、1つの引数を とってfに部分的に適用する変換を行う カリー化をしなさい。 def curry[A, B, C](f: (A, B) => C): A => (B => C)
  17. 17. Exercise 4 • uncurry化をしなさい。 def uncurry[A, B, C](f: A => B => C): (A, B) => C
  18. 18. Exercise 5 • 次の2つの関数を組み立てる高階関数を 定義しなさい。 def compose[A, B, C](f: B => C, g: A => B): A => C
  19. 19. 2.9 Conclusion • 関数型プログラミングの基本をさらった • 再帰、高階関数、ポリモーフィック関数 • 正確な実装は型に従って導かれる → “follow the types to the collect implementation”の訳 • これらの原則は大規模なプログラミングでも同じ

×