我正在努力深入了解功能性思维并寻找练习解决方案(99个问题)。
第一个问题是创建一个返回列表最后一个元素的函数。
我看到了解决方案:
myLast = foldr1 (const id)
我了解foldr1
将函数f
应用于列表l
所以,如果我把它插入一个例子:
myLast [1,2,3,4,5,6,7]
哪个会被“翻译成”
foldr1 (const id) [1,2,3,4,5,6,7]
有人可以向我解释这个(const id)是如何逐步完成的。我尝试在SO和Hoogle中研究(const id)
,但对它没有多大意义。有人会帮我介绍一下这里发生的事情吗?
答案 0 :(得分:7)
const
和id
是两个独立的功能,您可以在Hoogle上查找。也许在那之后你可以自己回答你的问题,但无论如何我都会回答。
const
是两个参数的函数,它总是返回其第一个参数。
id
是一个始终返回其参数的参数的函数。
因此(const id)
是一个始终返回id
的参数的函数,换句话说,是两个始终返回其第二个参数的参数的函数。
现在foldr1
接受两个参数f elem accum
的函数作为第一个参数,并从最后一个元素(使用它作为累加器的初始值)开始按顺序应用到列表中。在我们的例子中,f
将始终返回其第二个参数,因此无论accum
初始化为(列表的最后一个元素),它将在所有迭代中保持不变并将返回。
现在您可以使用seq
代替(const id)
,但seq
并非懒惰。或者您可以在不编写自己的函数的情况下使用last
:)