看看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 = (.)

  

 

相关文章:

  • 2022-12-23
  • 2022-02-15
  • 2021-05-17
  • 2022-01-13
  • 2021-11-20
  • 2022-12-23
  • 2021-12-26
  • 2022-12-23
猜你喜欢
  • 2021-11-28
  • 2021-04-28
  • 2022-12-23
  • 2021-11-05
  • 2022-12-23
  • 2021-07-09
相关资源
相似解决方案