3

我正在尝试更深入地了解功能性思维方式并查看练习的解决方案(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)正在经历什么。我尝试(const id)在 SO 和 Hoogle 中进行研究,但无法理解。有人会引导我了解这里发生的事情吗?

4

1 回答 1

7

const并且id是您可以在 Hoogle 上查找的两个独立功能。也许在那之后您可以自己回答您的问题,但无论如何我都会回答。

const是一个有两个参数的函数,总是返回它的第一个参数。 id是一个始终返回其参数的参数的函数。

因此(const id)是一个始终返回 的参数的函数id,或者换句话说,一个始终返回其第二个参数的两个参数的函数。

现在foldr1将两个参数的函数f elem accum作为第一个参数,并从最后一个元素开始按顺序将其应用于列表(将其用作累加器的初始值)。在我们的例子f中,总是会返回它的第二个参数,所以无论accum用(列表的最后一个元素)初始化什么,它都会在所有迭代中保持不变并返回。

现在你可以使用seq而不是(const id),但seq不是懒惰的。或者您可以直接使用last而不编写自己的函数:)

于 2013-09-08T04:29:35.083 回答