gpt4 book ai didi

haskell - 不清楚 foldl 类型定义

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

foldl :: (a -> b -> a) -> a -> [b] -> a
foldl step zero (x:xs) = foldl step (step zero x) xs
foldl _ zero [] = zero

我不太明白为什么 (a -> b -> a ) 返回 一个 , 还有 (a -> b -> a) -> a -> [b] -> 一个 返回 一个 .我认为应该是: (a -> b -> c ) -> a -> [b] -> c .有人可以根据下面的示例向我解释一下。谢谢!
foldl (+) 0 (1:2:3:[])
foldl (+) (0 + 1) (2:3:[])
foldl (+) ((0 + 1) + 2) (3:[])
foldl (+) (((0 + 1) + 2) + 3) ([])
foldl (+) (((0 + 1) + 2) + 3)

最佳答案

a表示累加器值的类型,b表示输入中每个元素的类型。 (a -> b -> a)是一个函数,它接受一个累加器值,列表中的某个项目,并返回一个可以传递到下一步的新累加器值。

初始值的类型必须是a以便函数的第一次调用可以接收累加器值。累加器函数必须采用 a并返回 a以便可以将累加器值传递给折叠的每个步骤。折叠的最终值必须是 a ,因为这是最终调用 fold 函数将返回的累加器的类型。
(a -> b -> c) -> a -> [b] -> c不能表示折叠,因为折叠函数不采用 c .折叠函数的输入和输出必须是相同的类型,这样累加器才能传递到下一个折叠步骤。

让我们看一个例子,如果 fold 函数返回 c 会发生什么。 .

f :: Integer -> Integer -> Bool   -- this is a valid (a -> b -> c)
f acc n = (acc + n) > 0

假设我们正在使用动态语言并尝试使用 f 进行折叠.运行时会发生什么?
foldl f 0 [1]     ~ (0 + 1) > 0            == True :: Bool

foldl f 0 [1, 2] ~ ((0 + 1) > 0) + 2) > 0 == error - no instance of (+) for Bool
\_________/ \
| \
Bool + Integer

您可以看到,如果您尝试使用不兼容的类型进行累积,则无法进行折叠。

关于haskell - 不清楚 foldl 类型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14768628/

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