对于列表,为什么 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 实例,其中 (=<<) = 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 获得:
newtype ZipList a = ZipList [a]
instance Applicative ZipList where
  pure = repeat
  (<*>) = zipWith ($)

关于haskell - 了解正确申请,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29023602/

10-10 16:25