Scala関数型デザイン&プログラミング ―Scalazコントリビューターによる関数型徹底ガイド (impress top gear)
- 作者: Paul Chiusano,Rúnar Bjarnason,株式会社クイープ
- 出版社/メーカー: インプレス
- 発売日: 2015/03/20
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (4件) を見る
P30 2.5.2 無名関数を使った高階関数の呼び出し
無名関数ってこんなふうにかくよね
scala> (x: Int, y: Int) => x == y: Boolean res7: (Int, Int) => Boolean = <function2> scala> val a = (x: Int, y: Int) => x == y: Boolean a: (Int, Int) => Boolean = <function2> scala> a(1,2) res8: Boolean = false scala> a(2,2) res9: Boolean = true scala> a(2,2) res10: Boolean = true
関数リテラルで実際に実装されるのはapply()メソッド
実装は型に従う
コンパイルできる実装は1つだけで、それは必然的に型シグネチャに従うものとなる。型で定義されているので、実装が多岐に渡ることはない、と思われる。
部分適用 partial1
def curry[A,B,C](f: (A, B) => C): A => (B => C) = a => b => f(a, b) def uncurry[A,B,C](f: A => B => C): (A, B) => C = (a, b) => f(a)(b) def compose[A,B,C](f: B => C, g: A => B): A => C = a => f(g(a))
scala> curry((x: Int, y: Int) => x + y)(4)(19) res15: Int = 23
scala> uncurry((x: Int) => (y: Int) => x + y)(4, 3) res13: Int = 7
scala> compose((x: Int) => x + 2, (y: Int) => y * 2)(3) res12: Int = 8
関数合成
scala> val g = f _ andThen math.sin g: Double => Double = <function1> scala> def f(x: Double): Double = math.Pi / 2 - x f: (x: Double)Double scala> val g = f _ andThen math.sin g: Double => Double = <function1> scala> g(2) res28: Double = -0.41614683654714246
3. 関数型プログラミングのデータ構造
- object ただひとつのインスタンス
- class クラス
Scalaクラスメモ(Hishidama's Scala class Memo)
_ 可変長引数みたく扱っている
scala> val ex1: List[Double] = Nil ex1: List[Double] = Nil scala> val ex2: List[Int] = Cons(1, Nil) ex2: List[Int] = Cons(1,Nil) scala> val ex3: List[String] = Cons("a", Cons("b", Nil)) ex3: List[String] = Cons(a,Cons(b,Nil))
なお、これは通らない。共変じゃなく不変だから。
sealed trait List[A] // `List` data type, parameterized on a type, `A` case object Nil extends List[Nothing] // A `List` data constructor representing the empty list case class Cons[A](head: A, tail: List[A]) extends List[A] // Another data constructor, representing nonempty lists. Note that `tail` is another `List[A]`, which may be `Nil` or another `Cons`.
P41 まで。 次回 3.2 パターンマッチング