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:矛盾