パイプ処理の例
最近(自分の中で)話題のElixir.
Haskellほど型ガッチガチしてなくて,今風な関数型言語です.
Elixirの魅力はたくさんあるのですが,その中でも関数のパイプ処理が自分の中では
結構気に入っています.
こんなやつ
[1, [2], 3, [4, 5] |> List.flatten |> Enum.map(&(&1 * 2))
|>
って演算子を使うことで,返値を右側の関数に渡すことが出来ます.
Pythonを使っていて,複数の関数を上記の様に出来たら,いいなぁって思いました.
出来たもの
こんな感じにしました.
def hoge(a, b, c, d) :
return a+b+c+d
pipe([1,2],
[
pmap(lambda x: x*2),
list,
to(hoge, [3, 4]),
print
]
)
pipe/2,to/2,pmap/1っていうのが,つくったものです.
それぞれの役割は,
pipe
第一引数に,パイプ処理を行う初期値,第二引数に関数のリスト
実装は,
from functools import reduce
def pipe(elm, fn_list) :
return reduce(lambda x, f: f(x), fn_list, elm)
to
自作関数をpipe関数に適した形に変換する高階関数.
実装は
def to(fn, outer_args=None) :
def _to(inner_args) :
args = outer_args+inner_args if not outer_args == None else inner_args
return fn(*args)
return _to
pmap
既存のmap関数をpipe関数用にラップしたもの
このほかにも,reduceとfilterもつくってありますが,とりあえず
実装は
def pmap(fn) :
def _pmap(li) :
return map(fn, li)
return _pmap
感想
結構簡単なことをするだけで,自分のやりたいことが出来たので満足です.
ただ,書き方が標準的な書き方から大きく乖離しているので,自分用のコードでしか使えないなと思いました.