2

在准备函数式编程考试时,我在之前的考试中遇到了以下问题:

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

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

["John","Smith,"]

我了解函数 reverse、take 和 words 在做什么,并且我了解 . 操作员将它们连接起来。我不明白这里发生了什么:

\ _ -> name

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

4

4 回答 4

6

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

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

\x -> x * x

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

_意思是“我们不关心谁的名字的变量” 。

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

于 2012-06-20T16:52:38.303 回答
5

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

于 2012-06-20T16:54:32.763 回答
3

一个常量匿名函数:无论哪个参数, return name

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

\x -> f x

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

于 2012-06-20T16:53:13.280 回答
2

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

于 2012-06-20T16:57:46.770 回答