LoginSignup
0
0

More than 5 years have passed since last update.

PythonでElixirのパイプっぽいことしたかった

Posted at

パイプ処理の例

最近(自分の中で)話題の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

感想

結構簡単なことをするだけで,自分のやりたいことが出来たので満足です.
ただ,書き方が標準的な書き方から大きく乖離しているので,自分用のコードでしか使えないなと思いました.

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0