Slide 1

Slide 1 text

カリー化入門 2019年あくあたん工房7月部会

Slide 2

Slide 2 text

そもそも カリー化って何?

Slide 3

Slide 3 text

カリー化 (currying, カリー化された =curried) とは、複数の引数をとる関数 を、引数が「もとの関数の最初の引 数」で戻り値が「もとの関数の残りの 引数を取り結果を返す関数」であるよ うな関数にすること(あるいはその関 数のこと)である。 出典:ウィキペディア

Slide 4

Slide 4 text

つまり、

Slide 5

Slide 5 text

N個の引数をとる関数 一引数を取る関数のチェイン

Slide 6

Slide 6 text

具体例

Slide 7

Slide 7 text

𝑓: 𝑥 → 𝑦 関数が引数を一つのみとる つまり、 すでにカリー化されている 引数を1個とる関数の場合

Slide 8

Slide 8 text

𝑓: 𝑥, 𝑦 → 𝑧 ↓ 𝑔: 𝑥 → (ℎ: 𝑦 → 𝑧) 引数を2個とる関数の場合

Slide 9

Slide 9 text

𝑓: 𝑥, 𝑦, 𝑧 → 𝑢 ↓ 𝑔: 𝑥 → (ℎ: 𝑦 → (𝑖: 𝑧 → 𝑢)) 引数を3個とる関数の場合

Slide 10

Slide 10 text

何が うれしいの?

Slide 11

Slide 11 text

具体例として, 2つの引数の合計を返す関数f(x, y) をmap関数に渡す場合を考える

Slide 12

Slide 12 text

カリー化 されていないとき

Slide 13

Slide 13 text

func f(x,y) int { return x + y } func g(x) int { return f(1, x) } list2 = map(g, list1)

Slide 14

Slide 14 text

カリー化 されているとき

Slide 15

Slide 15 text

func f(x,y) int { return x + y } list2 = map(g(1), list1)

Slide 16

Slide 16 text

部分適用で よくね

Slide 17

Slide 17 text

できることは同じ

Slide 18

Slide 18 text

func f(x,y) int { return x + y } g = partial(f, 1) list2 = map(g, list1)

Slide 19

Slide 19 text

おまけ Pythonでカリー化

Slide 20

Slide 20 text

>>> currying.f("a")("b")("c") 'abc' カリー化されてる関数

Slide 21

Slide 21 text

>>> currying.f("a")("b")("c") 'abc' 関数をカリー化する関数

Slide 22

Slide 22 text

ご清聴ありがとう ございました