関数適用の左結合性

関数適用の左結合性とは?
A Gentle Introduction to Haskell: Functionsを読む.

add (x,y) = x + y

関数 add の適用は add e1 e2 という形式になります。これは、 (add e1) e2 と同等の式 です。なぜかというと関数適用は左結合性をもつからです。いいかえ れば、関数 add を最初の引数に適用すると、新しい関数ができて、こ れをふたつめの引数に適用するということです。

あー,コレって学習曲線で伸び悩む,あの辺なんだろうか.まだそんなとこまで行ってるとは思えないが.ただ俺が頭悪いだけかorz


とりあえずそれは置いといて.
ということは,課題で考えると

g = (*)

に於いて,

g a b = (*) a b

だから,g e1 e2という形式だから(g e1) e2と同等の式になる.そして新しくできた(g e1)をe2に適応する,これが関数の左結合性だな.

Main> (g 2) 3
6
Main> f ((g 2) 3)
7


次に,(.)の型を確認.

Main> :t (.)
(.) :: (a -> b) -> (c -> a) -> c -> b

ということは

Main> (.) f (g 2) 3
7

これで正しく動く.これをどーすりゃhに投げ込めるか?

Main> (.) f g 2 3
ERROR - Cannot infer instance
*** Instance   : Enum (a -> a)
*** Expression : (f . g) 2 3

じゃ駄目だからなぁ.とりあえず,

h x = (.) f (g x)

なら動くぞ.もう一息(だと思う).