`sequenceA`如何工作 [英] How `sequenceA` works

查看:68
本文介绍了`sequenceA`如何工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm new to Haskell and trying to understand how does this work?

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)[]

But here i don't understand for which applicative functor operator <*> will be called, for ((->) r) or for []

(:) <$> (+1) <*> []

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

Can somebody go step by step and parse sequenceA [(+3),(+2),(+1)] 3 step by step? Thanks.

推荐答案

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

在ghci中尝试一下:

Try this in 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)

和模式匹配参数类型:t = [], f = (->) a 并且应用约束位于f上.

and pattern match the argument type: t = [], f = (->) a and the Applicative constraint is on f.

这篇关于`sequenceA`如何工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆