4

在 ZVON 上,为 takeWhile 函数提供的定义之一是

Input: takeWhile (\x -> 6*x < 100) [1..20]

Output: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]

有人可以解释这部分是什么(\x -> 6*x < 100)意思吗?

4

4 回答 4

11

这是一个匿名函数定义,也称为 lambda 表达式。 (\x -> 6*x < 100)是一个函数,它接受一个数字,并返回不等式的布尔结果。

由于像 Haskell 这样的函数式语言经常将函数作为参数,因此能够方便地在线定义简单的函数,而无需为其指定名称。

于 2013-04-26T17:34:23.187 回答
8

最初,故事是这样的,Alonzo Church想用抑扬符标记函数表达式中的变量,例如,(ŷ.x(yz))但当时普林斯顿的印刷机无法做到这一点。然后,他至少想在 vars 之前打印插入符,如下所示:(^y.x(yz)),但他们也不能这样做。

下一个最好的选择是改用希腊字母lambda,所以他们最终写了等等,因此lambda-expression(λy.x(yz))中的“lambda” 。这一切都只是一个印刷事故。

今天在 ASCII 终端上,我们甚至不能使用字母,因此在 Haskell 中我们使用反斜杠(在原始lambda 表达式符号中用λ箭头代替点):

(\y -> x (y z))

代表一个函数g,使得

g y = x (y z)

来源:在某处读过,不记得在哪里。

于 2013-04-26T21:53:43.627 回答
4

(\x -> 6*x < 100)是一个lambda,一个匿名函数,它接受一个参数(这里称为x)并计算 & 返回6*x < 100,即测试该数字乘以 6 是否小于 100。

于 2013-04-26T17:29:50.197 回答
4

它是一个 lambda 函数,即您在现场定义的一个函数,主要是为了方便。您将其读作“将 x 作为输入,将其乘以 6 并查看它是否小于 100”。不过,还有一些其他相关的便利设施。例如,在 Haskell 中,Lambda 函数和普通函数具有关联的词法环境,并且正确地说是闭包,因此它们可以使用环境作为输入来执行计算。

于 2013-04-26T17:30:03.933 回答