currying

31
カリー化 @akuraru

Upload: akura-pi

Post on 12-Jul-2015

276 views

Category:

Documents


2 download

TRANSCRIPT

カリー化@akuraru

自己紹介

• Scalaが好き

• Pythonは初めて触りました

@akuraru

カリー化• 複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること。

• カリー化(Wikipedia)

関数を返す関数は書きますか?

大抵の言語はできます

そのような関数を高階関数といいます

そのような関数を高階関数といいます

関数型言語汎用キャラクター 高階ことりちゃん→

カリー化

関数の引数の数は

1つですよね?

2引数以上は甘え!

カリー化すれば、1引数の関数にできる!

カリー化• 複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること。

• カリー化(Wikipedia)

カリー化

• 複数の引数をとる関数を、

• 1引数の関数にすること• カリー化された関数のこと

def f(x, y):return x * y

f(3, 4) # => 12

def f(x):def g(y):

return x * yreturn g

f(3)(4) # => 12

def f(x): return lambda y: x * y

f(3)(4) # => 12

何に使えるの?

1つ目の引数が同じで、複数回使う場合

def f(x): return lambda y: x * y

g = f(3)

g(4) # => 12g(5) # => 15g(10) # => 30

関数合成を書きたいとき

class compose(object): def __init__(self, *functions): if not functions: raise ValueError("compose need at least one function.") self.functions = list(functions)

def __call__(self, *args, **kwargs): result = self.functions[-1](*args, **kwargs) for function in reversed(self.functions[:-1]): result = function(result) return result

from functools import partialdef cMap(x): return lambda y: map(x, y)

def add(x): return lambda y: x+y

c = compose(','.join, list, reversed, cMap(str), cMap(add(5)))

c([1,2,3,4,5]) # => '10,9,8,7,6'

だいたいこんな感じです

まとめ

• 複数の引数をとる関数を、

• 1引数の関数にすること• カリー化された関数のこと

私のことは忘れてもカリー化のことは忘れないでください

たまに使うと便利です

部分適用とか知らん

詳しいことはぐるぐるしたリア充に聞けばいいじゃない

まとめ2

まぁ、そんなこと考えなくてもHaskellならはじめからカリー化されているからHaskell使えばいいじゃね?

以上