我正在尝试理解我所类的讲义中的一部分。它将长度函数定义为:

length = foldr (\_ n -> 1 + n) 0

有人可以解释一下这是怎么回事吗?我不能全神贯注于它。

最佳答案

首先,foldr的类型:(a -> b -> b) -> b -> [a] -> b
考虑到用法,foldr接受3个参数:函数(接受a。列表的元素和b。累加器,并返回累加器),累加器的起始值和列表。 foldr在通过列表应用函数后返回累加器的最终结果。

至于这段代码:

length = foldr (\_ n -> 1 + n) 0

如您所见,它缺少列表-因此右侧的返回值是一个将接收列表并产生Int的函数(与0相同的类型)。输入:[a] -> Int

至于右侧的含义:(\_ n -> 1 + n) 0\表示声明一个未命名的函数
_表示忽略列表中的元素(对应于a类型的foldr)。如您所知,foldr将遍历列表并将该函数应用于每个元素。这是传递给函数的元素。我们在length函数中没有使用它,因此我们表示应将其忽略。
n是作为累加器传入的Int的参数。
->表示返回
1 + n将增加累加器。您可以想象,返回值将被传递回foldr,并且foldr保存该值,以将其传递给函数(\_ n -> 1 + n)的下一次调用。

括号外的0是计数器的起始值。

关于haskell - 使用文件夹定义长度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11425334/

10-11 17:45