我正在尝试理解我所类的讲义中的一部分。它将长度函数定义为:
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/