gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:42:23 25 4
gpt4 key购买 nike

我正在尝试找出如何从 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,我好像联系不上回答的人了!

感谢任何帮助!

谢谢你:)

最佳答案

\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 函数是一个内置函数,它只是对 bool 值执行逻辑非:

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,但期望这会与期望它们表现良好的代码一起奇怪地运行。

关于haskell - (filter (\y -> not(x == y)) xs) 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29184859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com