关于< $>的优先混淆和< *>在哈斯克尔

时间:2015-03-30 09:35:21

标签: haskell functor

来自http://learnyouahaskell.com/functors-applicative-functors-and-monoids#applicative-functors

的两个例子

1)。 (+) <$> (+3) <*> (*100) $ 5

 (+) <$> (+3) <*> (*100) $ 5, the 5 first got applied to (+3) and
 (*100), resulting in 8 and 500. Then, + gets called with 8 and 500,
 resulting in 508.

从第一个示例开始,似乎<*>的优先级高于<$>

2)。 (++) <$> Just "johntra" <*> Just "volta"

 (++) <$> Just "johntra" <*> Just "volta",   resulting in a value
 that's the same as Just ("johntra"++),and now Just ("johntra"++) <*>
 Just "volta" happens, resulting in Just "johntravolta".

从第二个示例看,似乎<$>的优先级高于<*>

他们也有同样的优先权吗?有人可以给我一些解释/参考吗?

2 个答案:

答案 0 :(得分:4)

确实他们都有相同的优先级(infixl 4(<*>)(<$>)),你可以从左到右阅读 -

(+) <$> (+3) <*> (*100) $ 5
= ((+) <$> (+3)) <*> (*100) $ 5
= (\ a b -> (a+3) + b) <*> (\ a -> a*100) $ 5
= (\ a -> (a+3) + (a*100)) $ 5
= 8 + 500 = 508

记住在这种情况下我们有f <*> g = \x -> f x (g x)

答案 1 :(得分:2)

<$><*>具有相同的优先级和左关联性。 $的优先级最低为零。您可以使用ghci来探索有关它们的信息:

λ> :i (<$>)
(<$>) :: Functor f => (a -> b) -> f a -> f b
        -- Defined in ‘Data.Functor’
infixl 4 <$>

λ> :i (<*>)
class Functor f => Applicative (f :: * -> *) where
  ...
  (<*>) :: f (a -> b) -> f a -> f b
  ...
        -- Defined in ‘Control.Applicative’
infixl 4 <*>

现在你可以计算出类型以了解它们是如何进行类型检查的。