在学习功能编程考试时,我在之前的测试中遇到了以下问题:
t1 = (reverse . take 2 . words . \ _ -> name)"!"
任务是编写语句的输出。变量名称是指学生的姓名,以“Smith,John”的形式写成。如果我将语句输入WinHugs,我会得到以下输出:
["John","Smith,"]
我理解功能是什么反转,采取和言语正在做什么,我理解如何。操作员连接它们。我不明白的是这里发生了什么:
\ _ -> name
什么是斜线,下划线和“箭头”?另外,引号中的感叹号有什么作用? (没有?)
答案 0 :(得分:6)
这是一个lambda函数,它丢弃它的(唯一)参数(即“!”)并产生name
。
作为另一个lambda示例,以下将是一个lambda函数,用于对其参数求平方:
\x -> x * x
\
是用于引入lambda函数的符号。
_
表示“关于我们不关心其姓名的变量”。
->
将lambda函数的参数与用于指定其结果的表达式分开。
答案 1 :(得分:5)
你看到的是一个匿名函数或lambda函数(该名称来自lambda演算)。反斜杠告诉您正在启动该功能。下划线说该函数接受一个参数并忽略它。箭头从参数列表指向结果 - 在这种情况下,它最终忽略其参数并返回名称。基本上,\_ -> name
与const name
相同。
答案 2 :(得分:3)
一个常量匿名函数:参数,返回name
。
Haskell的lambda表达式(即匿名函数)以这种形式出现:
\x -> f x
其中x
是参数,f x
是使用此参数的表达式。特殊变量_
匹配任何内容并将其视为不重要。
答案 3 :(得分:2)
“斜线”是lambda function的一部分,下划线是模式中使用的“通配符”(它被丢弃)。箭头是lambda函数的另一部分。无论输入如何,函数\ _ -> name
都会返回名称,因此“!”除了为函数提供(未使用的)输入外什么都不做。