我正在尝试找出如何从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年,我似乎无法与回答的人取得联系!
感谢任何帮助!
谢谢你:)
答案 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
,但希望这会使代码表现得很奇怪。