generated at
point-free style
引数を省略した関数を . 演算子で合成関数をつくることで関数を定義する
やりすぎ禁物

Tacit Programmingとも言うらしい


poinrtfreeに変換する



手順
カッコで括る
$ でカッコを外す
. で関数合成

hs
-- ":t hoge"という文字列を"hoge"に変換する関数 eliminate cmd = drop 1 (dropWhile (> ' ') cmd) -- カッコで括る eliminate cmd = drop 1 $ dropWhile (> ' ') cmd -- `$`にする eliminate = drop 1 . dropWhile (> ' ') -- `.`にする


コツ
記号を関数としてみる
x == y (==) x y としてみる
f >>= x (>>=) f x としてみる
という感じ
foo x = f . g x という関数を
foo x = (f .) (g x) とカッコを付けて読む
すると foo = (f .) . g と変換できる

これとかできる?
bind a b vs = Map.insert (fromJust $ Map.lookup b vs) a vs
Mapであるvsのうち、bの値をaの値にする
[(a,1), (b,2)] [(a,2),(b,2)]
vs が2箇所で出てきている


Pointfreeにするかどうかで評価回数が変わることがある
つまり、Pointfreeにしないとパフォ劣化があり得る例がある
問題になるほどのパフォ劣化かどうかは知らんけど


良い練習になる
最初に読むと良いかも
問題もいくつもある
eqShow x y = show (x==y) ref
可読性がむちゃくちゃ落ちるような極端な例なので、実用的ではないが練習には良いmrsekut


参考