まず、あなたはあなたの表記でずさんです。
(.) = (f.g) x = f (g x) -- this isn't true
何が本当:
(.) f g x = (f.g) x = f (g x)
(.) = \f g x -> f (g x)
そしてその型は
(.) :: (b -> c) -> (a -> b) -> a -> c
-- n.b. lower case, because they're type *variables*
その間
(.)(.) :: (a -> b -> d) -> a -> (c -> b) -> c -> d
-- I renamed the variables ghci gave me
さあ、ワークアウトしましょう
(.)(.) = (\f' g' x' -> f' (g' x')) (\f g x -> f (g x))
= \g' x' -> (\f g x -> f (g x)) (g' x')
= \g' x' -> \g x -> (g' x') (g x)
= \f y -> \g x -> (f y) (g x)
= \f y g x -> f y (g x)
= \f y g x -> (f y . g) x
= \f y g -> f y . g
そして($)
?
($) :: (a -> b) -> a -> b
f $ x = f x
($)
単なる関数適用です。ただし、並置による関数適用は優先順位が高いのに対し、関数適用による関数適用($)
は優先順位が低くなります。
square $ 1 + 2 * 3 = square (1 + 2 * 3)
square 1 + 2 * 3 = (square 1) + 2 * 3 -- these lines are different