(filter(\ y - > not(x == y))xs)是什么意思?

时间:2015-03-21 16:07:28

标签: haskell

我正在尝试找出如何从haskell中的列表中删除重复项。我在下面找到了我的问题答案......

type Regist = [String]
type ListRe = [Regist]

rmDup :: ListRe -> ListRe
rmDup [] = []
rmDup (x:xs) = x : rmDup (filter (\y -> not(x == y)) xs)
在stackoverflow上的

但我不明白最后一行的特定部分是什么意思或特别是

(\y -> not(x == y))

我从来没有见过\ y之前使用过或“没有”这让我感到困惑!

我想对答案添加评论,但我的帐户上没有足够的声誉来添加对答案的评论(有人提出问题),询问答案以及答案来自2010年,我似乎无法与回答的人取得联系!

感谢任何帮助!

谢谢你:)

1 个答案:

答案 0 :(得分:6)

\name -> expr语法定义了一个lambda函数,也称为匿名函数。这只是在Haskell中定义函数的另一种方法,当您不想为其命名时,该函数特别有用。例如,在

> map (\x -> x + 1) [1, 2, 3]
[2, 3, 4]

将其写成

会非常痛苦
> let add1 x = x + 1 in map add1 [1, 2, 3]
[2, 3, 4]

因为此名称仅使用一次,并且这种一般模式在Haskell(和其他函数语言) [1] 中非常常见。您甚至可以在定义普通函数时使用此语法:

> let add1 = \x -> x + 1 in map add1 [1, 2, 3]
[2, 3, 4]

无论如何,编译器基本上都会对你的所有函数执行此操作,因为这种形式更容易在内部操作。

您看到使用的not函数是一个内置函数,只是对布尔值执行逻辑NOT:

not :: Bool -> Bool
not True = False
not False = True

所以表达式\y -> not (x == y)等同于\y -> x /= y [2]


[1] 对于这个例子,你实际上可以省略lambda,如果你真的想要并将其写成map (+1) [1, 2, 3],因为Haskell允许你部分应用运算符,这是一个非常方便的功能我我一直希望自己有其他编程语言。知道运算符部分非常有用,可以帮助减少大量不必要的输入。

[2] 或者至少应该是这样,尽管您可以定义一种类型,其中Eq的实例定义==/=以便始终返回True,但希望这会使代码表现得很奇怪。