引数が1つの式内で2箇所で現れる場合
f x = (x + 1) * ((x + 4) `div` 2)
ひとまず演算子表現を関数表現に直す
f x = (*) ((+) x 1) (div ((+) x 4) 2)
xを含む項それぞれを関数にして一時的に切り出す
f x = (*) (g $ x) (h $ x)
g x = (+) x 1
h x = div ((+) x 4) 2
これの場合fは単純に2つの計算結果の積なのでListのfoldl1の形に直せる
f x = foldl1 (*) [g $ x, h $ x]
g x = (+) x 1
h x = div ((+) x 4) 2
リストの中身はそれぞれxを与えるだけの関数なのでzipWithと($)を使って関数とxを分離する
f x = foldl1 (*) (zipWith ($) [g, h] [x, x])
g x = (+) x 1
h x = div ((+) x 4) 2
xを2つ含むリストはreplicate 2を使えばx一つの引数で実現可能
f x = foldl1 (*) (zipWith ($) [g, h] (replicate 2 x))
g x = (+) x 1
h x = div ((+) x 4) 2
g,hをfに戻す
完成!
最終更新:2019年12月28日 08:00