我是Haskell的新手,并试图了解它如何工作?

sequenceA [(+3),(+2),(+1)] 3

我从定义开始
sequenceA :: (Applicative f) => [f a] -> f [a]
sequenceA [] = pure []
sequenceA (x:xs) = (:) <$> x <*> sequenceA xs

然后展开递归到这个
(:) <$> (+3) <*> $ (:) <$> (+2) <*> $ (:) <$> (+1) <*> pure []
(:) <$> (+3) <*> $ (:) <$> (+2) <*> $ (:) <$> (+1) <*> []

但是在这里,我不知道针对<*>((->) r)将针对哪个应用仿函数运算符[]进行调用
(:) <$> (+1) <*> []

有人可以一步一步去解析sequenceA [(+3),(+2),(+1)] 3吗?谢谢。

最佳答案

它正在使用instance Applicative ((->) a)

在ghci中尝试以下操作:

Prelude> :t [(+3),(+2),(+1)]
[(+3),(+2),(+1)] :: Num a => [a -> a]

Prelude> :t sequenceA
sequenceA :: (Applicative f, Traversable t) => t (f a) -> f (t a)

和pattern匹配参数类型:t = [], f = (->) a并且应用约束在f上。

10-06 02:45