gpt4 book ai didi

haskell - `sequenceA` 的工作原理

转载 作者:行者123 更新时间:2023-12-04 22:44:11 25 4
gpt4 key购买 nike

我是 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一步步?谢谢。

最佳答案

这可以从sequenceA的类型看出:
sequenceA :: (Applicative f, Traversable t) => t (f a) -> f (t a)
参数的外部类型必须是 Traverable , 其内部类型必须是 Applicative .

现在,当你给 sequenceA 一个函数列表 (Num a) => [a -> a]列表将是 Traversable ,列表中的内容应该是Applicative .因此,它使用函数的应用实例。

因此,当您将 sequenceA 应用于 [(+3),(+2),(+1)] ,建立以下计算:

sequenceA [(+3),(+2),(+1)] = (:) <$> (+3) <*> sequenceA [(+2),(+1)]
sequenceA [(+2),(+1)] = (:) <$> (+2) <*> sequenceA [(+1)]
sequenceA [(+1)] = (:) <$> (+1) <*> sequenceA []
sequenceA [] = pure []

让我们看看最后一行。 pure []获取一个空列表并将其放入某个应用结构中。正如我们刚刚看到的,本例中的应用结构是 ((->) r)。 .正因为如此, sequenceA [] = pure [] = const [] .

现在,第 3 行可以写成:
sequenceA [(+1)] = (:) <$> (+1) <*> const []

以这种方式与 <$> 组合功能和 <*>导致并行应用。 (+1)const []都应用于同一个参数,结果使用 (:) 合并

因此 sequenceA [(+1)]返回一个接受 Num a => a 的函数类型值,适用 (+1)到它,然后将结果添加到一个空列表 \x -> (:) ((1+) x) (const [] x) = \x -> [(+1) x] .

这个概念可以进一步扩展到 sequenceA [(+3), (+2), (+1)] .它产生一个函数,该函数接受一个参数,将所有三个函数应用于该参数,并将三个结果与 (:) 结合起来。将它们收集到一个列表中: \x -> [(+3) x, (+2) x, (+1) x] .

关于haskell - `sequenceA` 的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34629132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com