了解正确的申请

时间:2015-03-13 01:54:55

标签: haskell applicative

对于List,为什么right apply (*>)表现为重复并附加第二个参数n次,其中n是第一个参数的长度?

ghci> [1,2,3] *> [4,5]
[4,5,4,5,4,5]

1 个答案:

答案 0 :(得分:7)

默认情况下,*>运算符定义为

xs *> ys = id <$ xs <*> ys

默认情况下会转换为

const id <$> xs <*> ys

也就是说,它会将xs的每个元素替换为id以获取xs',然后计算xs' <*> ys[]Monad个实例,其中(=<<) = concatMapApplicative的一项法律规定了ApplicativeMonad个实例之间的关系:

pure = return
fs <*> as = fs `ap` as = fs >>= \f -> as >>= \a -> f a

对于列表,这是

fs <*> as = [f a | f <- fs, a <- as]

因此*>列表最终由Monad实例确定。

请注意,列表还有另一个非常明智的Applicative实例,可通过Control.Applicative中的新类型提供:

newtype ZipList a = ZipList [a]
instance Applicative ZipList where
  pure = repeat
  (<*>) = zipWith ($)