読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

Scala関数型デザイン&プログラミング読書会@渋谷 #functional_shibuya

勉強会 Scala

fancs.connpass.com

Scala関数型デザイン&プログラミング ―Scalazコントリビューターによる関数型徹底ガイド (impress top gear)

Scala関数型デザイン&プログラミング ―Scalazコントリビューターによる関数型徹底ガイド (impress top gear)

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 パターンマッチング