为什么 f <$> g <$> x 等同于 (f . g) <$> x 尽管 <$> 不是右关联?



为什么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也会失败。

为什么f <$> g <$> x等同于(f . g) <$> x

这与其说是函子的东西,不如说是哈斯克尔的东西。它起作用的原因是函数是函子。两个<$>运算符都在不同的函子中工作!

f <$> g实际上与f . g相同,因此您询问的等价性比f <$> (g <$> x) ≡ f . g <$> x要琐碎得多。

相关内容

  • 没有找到相关文章

最新更新