在Haskell中,(== " ")是什么意思?

7
对于那些可能会说“去教科书里查一下”或者“Hoogle它”的秃鹫们,我已经查过了。我看到了这个语句:recipe = (== "000001")。它看起来像是一个布尔值,但我不确定。我曾尝试在GHCi中以不同的方式对其进行测试,但我无法找出任何有效的方法。请问有人能解释一下它的含义吗?当下次有人谷歌“Haskell(==“ ”)”时,这个问题就会得到解决。

3
下次有人在谷歌搜索“Haskell (==”时,这个问题将成为搜索结果。不,它不会。谷歌忽略标点符号,搜索“Haskell (==”与仅搜索“Haskell”相同。这也解释了为什么您搜索时没有得到任何有用的结果。 - sepp2k
1
@Imray 对于糟糕的编辑我很抱歉。 - dreamcrash
1
只是想补充一下,虽然在这种情况下它没有用处,但将来可能会有用 http://www.haskell.org/haskellwiki/Keywords - Gert Cuykens
3
当我看到以“To the vultures ...”开头的表述时,我不太想写回答。请克服您对此的防御性反应,既是为了找到答案,也是为了您自己的心灵平静。只需在您的帖子中某处写下“我已经谷歌和hoogled过了,但没有找到答案”,这会提高您得到答案的机会。如果您这样表达,您将减少感觉存在某些“秃鹫”的感觉。我不确定我是否用正确的方式表达了这个意思,但我希望您能理解。 - Boris
1
@Boris 这个网站上的 Haskell 社区非常友善和乐于助人,他们知道我在谈论什么。但是有时候会有人评论说“你查过了吗?”并且给我点踩,这些人根本没有认真思考我的问题。我想我当时表达了一些沮丧情绪,但我理解你的意思。在这样一个充满爱心和帮助的环境中,我不应该表现得消极。感谢你指出来。 - CodyBugstein
显示剩余4条评论
4个回答

28

这是一个部分。它相当于recipe = \x -> x == "000001"(它又与recipe x = x == "000001"相同)。


12
你可以使用 GHCI 来解决这个问题。
GHCI 中输入 let recipe = (== "000001")。现在我们可以看看它是如何工作的。尝试使用 :t recipe 查看类型。它返回 recipe :: [Char] -> Bool,因此看起来这是一个接受字符列表(即 String)并返回布尔值的函数。
如果你进行测试,你会发现除了 "000001" 以外的任何输入都会返回 False
由于 == 是运算符,你可以部分应用它到一个参数上,它将返回一个接受另一个参数并返回结果的函数。所以这里的 == "000001" 返回一个函数,它接受一个参数来填充 == 的另一侧,并返回结果。

编辑:如果定义为 recipe = ((==) "000001"),那么这个解释就是正确的。

要理解这一点,你应该查找 部分应用== 函数的类型是 a -> a -> Bool,它接受两个相同类型的参数并返回一个 Bool
但它也是一个类型为 a -> (a -> Bool) 的函数,它接受一个类型为 a 的参数并返回一个新的函数,其签名为 a -> Bool。这就是这里发生的事情。我们提供了一个参数给 ==,所以它返回了一个类型为 a -> Bool 或者在这个特定的例子中是 [Char] -> Bool 的新函数。

这不是柯里化。嗯,不是直接的。 - Cat Plus Plus
3
不,这里不是发生了那种情况。(== foo) 确定了 ==第二个参数,而不是第一个。因此,它不仅仅是调用带有一个参数的 == - sepp2k
噢,是我的错,我会把它修复好的。 - Jeff Burka
3
@WillNess 有区别,因为它恰好适用于这个运算符而手舞足蹈地抛掉它是不好的。 - Cat Plus Plus
@WillNess 这里的结果没有区别,但我认为解释这种区别仍然是有益的,以防人们继续测试 func = (< 5) 或其他类似情况。此外,原文中使用了柯里化而非部分应用,因此无论如何都是错误的。 - Jeff Burka
显示剩余5条评论

7
对于二元运算符@,表达式(@ x)意味着(\y -> y @ x)
在您的情况下,它将是(\y -> y == "000001"),即一个接收字符串并判断其是否等于"000001"的函数。

5

(== arg) 或者 (arg ==) 是一个操作符部分应用(它也适用于其他操作符,不仅仅是==)。它的作用是将操作符部分应用于给定的操作数。所以(== "foo")等同于\x -> x == "foo"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接