在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)
部分的含义吗?
答案 0 :(得分:8)
这是一个匿名函数定义,也称为lambda表达式。 (\x -> 6*x < 100)
是一个接受数字的函数,并返回不等式的布尔结果。
由于像Haskell这样的函数式语言经常将函数作为参数,因此能够在线定义简单函数是很方便的,而无需为它们指定名称。
答案 1 :(得分:8)
最初的故事是,Alonzo Church想要用circumflex标记功能表达式中的变量,例如(ŷ.x(yz))
但普林斯顿印刷机当时无法做到这一点。然后他想至少在vars之前打印carets,如下所示:(^y.x(yz))
,但他们也不能这样做。
下一个最佳选择是使用希腊字母 lambda ,因此他们最终编写了(λy.x(yz))
等,因此 lambda-expression <中的“lambda” / em>的。这只是一个印刷事故。
今天在ASCII终端上我们甚至不能使用字母λ
,因此在Haskell中我们使用反斜杠(并用箭头代替原始lambda-expressions notation中的点):
(\y -> x (y z))
代表函数g
,以便
g y = x (y z)
来源:在某处读它,不记得在哪里。
答案 2 :(得分:4)
(\x -> 6*x < 100)
是一个 lambda ,一个匿名函数,它接受一个参数(此处称为x
)并计算&amp;返回6*x < 100
,即测试该数字乘以6是否小于100.
答案 3 :(得分:4)
它是一个lambda函数,也就是说,你在现场定义的函数主要是为了方便起见。您将其读作“将x作为输入,乘以6,看它是否小于100”。不过,还有一些其他相关设施。例如,在Haskell中,Lambda函数和普通函数具有关联的词法环境并且正确地说closures,因此它们可以使用环境作为输入来执行计算。