Haskell:具有匿名/ lambda函数的函数组合

时间:2012-06-20 16:50:12

标签: haskell functional-programming

在学习功能编程考试时,我在之前的测试中遇到了以下问题:

t1 = (reverse . take 2 . words . \ _ -> name)"!"

任务是编写语句的输出。变量名称是指学生的姓名,以“Smith,John”的形式写成。如果我将语句输入WinHugs,我会得到以下输出:

["John","Smith,"]

我理解功能是什么反转,采取和言语正在做什么,我理解如何。操作员连接它们。我不明白的是这里发生了什么:

\ _ -> name

什么是斜线,下划线和“箭头”?另外,引号中的感叹号有什么作用? (没有?)

4 个答案:

答案 0 :(得分:6)

这是一个lambda函数,它丢弃它的(唯一)参数(即“!”)并产生name

作为另一个lambda示例,以下将是一个lambda函数,用于对其参数求平方:

\x -> x * x

\是用于引入lambda函数的符号。

_表示“关于我们不关心其姓名的变量”。

->将lambda函数的参数与用于指定其结果的表达式分开。

答案 1 :(得分:5)

你看到的是一个匿名函数或lambda函数(该名称来自lambda演算)。反斜杠告诉您正在启动该功能。下划线说该函数接受一个参数并忽略它。箭头从参数列表指向结果 - 在这种情况下,它最终忽略其参数并返回名称。基本上,\_ -> nameconst name相同。

答案 2 :(得分:3)

一个常量匿名函数:参数,返回name

Haskell的lambda表达式(即匿名函数)以这种形式出现:

\x -> f x

其中x是参数,f x是使用此参数的表达式。特殊变量_匹配任何内容并将其视为不重要。

答案 3 :(得分:2)

“斜线”是lambda function的一部分,下划线是模式中使用的“通配符”(它被丢弃)。箭头是lambda函数的另一部分。无论输入如何,函数\ _ -> name都会返回名称,因此“!”除了为函数提供(未使用的)输入外什么都不做。