はじめに
前の記事でMaybe
モナドを実現したが、そこでリストを取得したときにそれぞれに対して関数を適用して、Maybe
モナドでつなげたいとする。このMaybe
モナドの仕様上、流れてくる値に適用するす関数は引数を一つしか取れない。そう、カリー化が必要なのである。
実装
以下は最小の実装である。
1 | class Curry(object): |
やっていることは引数を[x]
が呼ばれるだけ溜め込んでいき、()
で関数を実行するときに溜め込んだ引数を適用しているだけだ。
これを使うとMaybe
モナドを使用してこのようなことができる。
1 | print(Just([1, 2, 3])[Curry(map, 2)[lambda n:n**2]][list][sum]()) # 14 |
Maybe
モナドの強さがお分かりいただけただろう。カリー化できるようになっただけでここまでできることが増えるである。