プログラミング > Haskell > ひきすうひっぱがす

まずyをひっぱがす
f x y = (x + 1) * (y `div` 2)
 
演算子表現を関数表現に直す
f x y = (*) ((+) x 1) (div y 2)
 
yを含む項を$演算子で分離
f x y = (*) ((+) x 1) $ (div y 2)
 
yを含む項の外側の括弧をはずす($で分離したので出来る)
f x y = (*) ((+) x 1) $ div y 2
 
yの外側に括弧が無くなったのでyを最後尾に持ってくる(この場合flip使えばいい)
f x y = (*) ((+) x 1) $ flip div 2 y
 
yが最後尾に来たので$演算子で分離
f x y = (*) ((+) x 1) $ flip div 2 $ y
 
左の$演算子を関数合成の(.)演算子に変更する
f x y = (*) ((+) x 1) . flip div 2 $ y
 
ひとつの合成関数になったのでyをひっぱがせる
f x = (*) ((+) x 1) . flip div 2
 
xをひっぱがす、さっきと同様にして演算子表現を関数表現に直す
f x = (.) ((*) ((+) x 1)) (flip div 2)
 
xを含む項を最後尾に持ってくる(この場合はflip使えばよい)
f x = flip (.) (flip div 2) ((*) ((+) x 1))
 
xを含む項を$演算子で分離
f x = flip (.) (flip div 2) $ ((*) ((+) x 1))
 
xを含む項の一番外側の括弧をはずす($で分離したので出来る)
f x = flip (.) (flip div 2) $ (*) ((+) x 1)
 
xを含む項が小さくなったので更にxを含む項を$演算子で分離
f x = flip (.) (flip div 2) $ (*) $ ((+) x 1)
 
同様にxを含む項の一番外側の括弧をはずす($で分離したので出来る)
f x = flip (.) (flip div 2) $ (*) $ (+) x 1
 
xを含む項を最後尾に持ってくる(この場合は(+)は引数順を逆にしても結果は同じ(適用順的には意味は変わるが))
f x = flip (.) (flip div 2) $ (*) $ (+) 1 x
 
xを$演算子で分離
f x = flip (.) (flip div 2) $ (*) $ (+) 1 $ x
 
左方のすべての$演算子を関数合成の(.)演算子に変更する
f x = flip (.) (flip div 2) . (*) . (+) 1 $ x
 
ひとつの合成関数になったのでxをひっぱがせる
f = flip (.) (flip div 2) . (*) . (+) 1
 
完成!
最終更新:2019年12月28日 07:38