为什么 f <$> g <$> x
等价于 (f . g) <$> x
,尽管 <$>
不是右结合的?
(这种等价性在 一种常用的习惯语境 中使用普通的 $
是有效的,但当前的 $
是右结合的!)
<*>
与 <$>
具有相同的结合性和优先级,但行为不同!
例如:
Prelude Control.Applicative> (show . show) <$> Just 3
Just "\"3\""
Prelude Control.Applicative> show <$> show <$> Just 3
Just "\"3\""
Prelude Control.Applicative> pure show <*> pure show <*> Just 3
<interactive>:12:6:
Couldn't match type `[Char]' with `a0 -> b0'
Expected type: (a1 -> String) -> a0 -> b0
Actual type: (a1 -> String) -> String
In the first argument of `pure', namely `show'
In the first argument of `(<*>)', namely `pure show'
In the first argument of `(<*>)', namely `pure show <*> pure show'
Prelude Control.Applicative>
Prelude Control.Applicative> :i (<$>)
(<$>) :: Functor f => (a -> b) -> f a -> f b
-- Defined in `Data.Functor'
infixl 4 <$>
Prelude Control.Applicative> :i (<*>)
class Functor f => Applicative f where
...
(<*>) :: f (a -> b) -> f a -> f b
...
-- Defined in `Control.Applicative'
infixl 4 <*>
Prelude Control.Applicative>
根据<$>
的定义,我预期show <$> show <$> Just 3
也会失败。
(<$>)
函数用于函数函子,它将一个函数组合到一个作为函子的函数之前,该函子的Functor
实例定义了(<$>)
函数作为(.)
函数,其功能是接受一个函数并产生一个函数,该函数接受一个函数并返回一个函数,该函数像两个组合在一起的函数一样运行。 - leftaroundaboutforever putStrLn "Hello, infinity"
- imz -- Ivan Zakharyaschev