我是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上。