point-free style
引数を省略した関数を .
演算子で合成関数をつくることで関数を定義する
やりすぎ禁物
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可読性がむちゃくちゃ落ちるような極端な例なので、実用的ではないが練習には良い

参考