对于List,为什么right apply (*>)
表现为重复并附加第二个参数n
次,其中n
是第一个参数的长度?
ghci> [1,2,3] *> [4,5]
[4,5,4,5,4,5]
答案 0 :(得分:7)
默认情况下,*>
运算符定义为
xs *> ys = id <$ xs <*> ys
默认情况下会转换为
const id <$> xs <*> ys
也就是说,它会将xs
的每个元素替换为id
以获取xs'
,然后计算xs' <*> ys
。 []
是Monad
个实例,其中(=<<) = concatMap
。 Applicative
的一项法律规定了Applicative
和Monad
个实例之间的关系:
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 ($)