看看fmap的类型
fmap :: Functor f => (a -> b) -> f a -> f b
很明显的,第一个参数是function,第二个参数是functor的一个instance
但是我们这么写
ghci> let f = (*5)
ghci> let g = (+3)
ghci> (fmap f g) 8
而且最后得到55
看到这个当时我和我的小伙伴们都惊呆了!
为毛啊,明明是一个 x -> y 的function啊,为毛可以!!!
后来经过九瓜老师的点拨
a + b我们可以看作 (+) a b
同理 a -> b就是 (->) a b
Int -> Int 可以被看作 (->) Int Int,((->) Int) 可以是 Functor
so,我们来看看fmap
(a -> b) -> f a -> f b
我们把f替换成((->) r)
(a -> b) -> ((->) r a) -> ((->) r b)
继续把(->)r x替换成 r -> x,得到
(a -> b) -> (r -> a) -> (r -> b)
很眼熟有木有!不就是function composition么..
翻看(->r)的instance也是这么回事
instance Functor ((->) r) where
fmap = (.)