8

对于那些可能会说“在你的教科书中查找”或“Hoogle it”的秃鹰,我做到了。

我看到了声明

recipe = (== "000001")

对我来说,它看起来像是某种布尔值,但我不确定。我已经尝试在 GHCi 中以不同的方式对其进行测试,但我无法找出任何可行的方法。有人能解释一下这是什么意思吗,这个问题将是下次有人谷歌Haskell时的结果(=="")

4

4 回答 4

28

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

于 2013-02-13T23:55:16.013 回答
12

你可以用GHCI这个来解决这个问题。

GHCI,放入let recipe = (== "000001")。现在我们可以看到它是如何工作的。试试看:t recipe是什么类型。返回recipe :: [Char] -> Bool,所以看起来这是一个接受Chars (a String) 列表并返回 a的函数Bool

如果你测试它,你会发现它会返回False任何输入,除了"000001".

由于==is 是一个运算符,因此您可以将其部分应用于一个参数,它将返回一个函数,该函数接受另一个参数并返回结果。因此,这里== "000001"返回一个函数,该函数接受一个参数来填充 the 的另一侧==并返回结果。


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

要理解这一点,您应该查找partial application。该==函数的类型是a -> a -> Bool,一个接受两个相同类型的参数并返回一个 的函数Bool

但它也是一个类型的函数a -> (a -> Bool),它接受一个类型的参数a并返回一个带有签名的新函数a -> Bool。这就是这里发生的事情。我们为 提供了一个参数==,因此它返回了一个类型为 的新函数a -> Bool,或者[Char] -> Bool在这种特殊情况下。

于 2013-02-13T23:55:16.060 回答
7

对于二元运算符@,表达式(@ x)意味着(\y -> y @ x).

在你的情况下,它将是(\y -> y == "000001")ie。接受 String 并判断它是否等于的函数"000001"

于 2013-02-13T23:55:03.617 回答
5

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

于 2013-02-13T23:55:11.800 回答