まだ十分整理できていないがカリー化についてわかったことを一旦書いてみる。
Currying とは複数の引数を取る関数を、一つの引数を取る複数の関数の形で書くことを言うっぽい。
例えば Python で
def adder(a, b):
return a + b
adder(2, 3) # returns 5
という関数をカリー化すると
def adder(a):
def inner_function(b):
return a + b
return inner_function
adder(2)(3) # returns 5
という書き方になる。
クロージャだし正直ややこしいと思うのだがどうだろう。管見の限りだと Python と JavaScript では、クロージャを作ったら結果的にカリー化したことになることがある、という感じで積極的にカリー化したほうが良いということではなさそう。関数型言語で役に立つ概念で、 Python と JavaScript ではカリー化するメリットはほとんどないように思える。
ところで2つ目のコードを lambda
を使って書くと下のようになる。
def adder(a):
return lambda b: a + b
adder(2)(3) # returns 5
lambda
はコードが読みにくくなると思って避けていたが、ここでは lambda
を使うことで return
が1個となり、関数に名前をつけるよりも簡素になってわかりやすいかもと思った。
以下、リンク集。
- What is 'Currying'? - Stack Overflow
- Currying - CS 61A Wiki
- How does currying lambda expressions work? - Stack Overflow
- Python Functions: Lambdas, Closures, Decorators, and Currying | by Yong Cui | Better Programming
- Anonymous function - Wikipedia
- How to Use Python Lambda Functions
- Lambda Functions in Python: What Are They Good For? – dbader.org