对于列表,为什么 right apply (*>)
表现为重复并附加第二个参数 n
次,其中 n
是第一个参数的长度?
ghci> [1,2,3] *> [4,5]
[4,5,4,5,4,5]
最佳答案
*>
运算符默认定义为
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 获得:newtype ZipList a = ZipList [a]
instance Applicative ZipList where
pure = repeat
(<*>) = zipWith ($)
关于haskell - 了解正确申请,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29023602/