ドット練習問題

ドットで関数を結合 - もちより,b2oxさんに問題を頂きました.

# b2ox 『(.)が使いこなせるようになるとPreludeのpredの定義のように引数を省略した書き方が出来るようになります。
f::b->c, g::a->b, (f . g)::a->c
(.) f g x = ((.) f g) x = (f . g) x = f (g x)


さて、ここで問題。
f::c->d, g::a->b->c, h::a->b-> d
h x y = f (g x y)
なるhをx,yを使わずにf,g,(.)だけで書きましょう。
とりあえずa=b=c=d=Int, f=succ, g=(*)としてトライしてみて下さい。
ちなみに、 h = f . g ではありません。』

さて,解けるかな!


先ずは,普通に

f = succ
g = (*)
h x y = f (g x y)

としたときの挙動を考えると,

  1. 2つの数をかける
  2. それをsuccする

ですね.だから,2,4を与えると9になれば良い.


安直に動くものを考えると

h = g . f

なんだけど,コレだと

(.) g f a b = (g . f) a b = g ( f a ) b

だから駄目.理想から考えると

f (g a b) = (f . g) a b

と,まさに間違いになってしまう.駄目だ,わかんない.もう少し考えます.明日の記事を書くまで.