Haskellでの関数変形
続かないシリーズ*1第1回
Haskellの関数合成による関数の変形 〜全部関数合成でかけるよ!〜
こんな関数がある。
f x y = 0 /= x mod y
xがyで割り切れないときにTrueを返す関数。
(素数を求めるときとかに使う)
これを引数なしで定義したいときはどうするか。
まずは評価順序を把握するために括弧をつける。
また、中置記法は前置に直す。(Lispじゃん)
f x y = (/= 0) ((mod x) y)
次に、(.)を使ってf(g x)→(.) f g xに書き換える
f x y = (.) (/= 0) (mod x) y
(.)の部分適用
f x y = ((/= 0).) (mod x) y
もう一度、(.)を使ってf(g x)→(.) f g xに書き換える
f x y = ((.) ((/= 0).) mod x) y
(.)の適用
f x y = ((((/= 0).).mod) x) y
省略可能な括弧をはずす
f x y = (((/= 0).).mod) x y
これで、引数が省略できる形になったので、
f = ((/= 0).).mod
結局、次の式は等価。
f x y = 0 /= x mod y f = ((/= 0).).mod
ね、簡単でしょう?
続かない。
*1:矛盾