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