对于那些可能会说“去教科书里查一下”或者“Hoogle它”的秃鹫们,我已经查过了。我看到了这个语句:recipe = (== "000001")。它看起来像是一个布尔值,但我不确定。我曾尝试在GHCi中以不同的方式对其进行测试,但我无法找出任何有效的方法。请问有人能解释一下它的含义吗?当下次有人谷歌“Haskell(==“ ”)”时,这个问题就会得到解决。
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
的新函数。(== foo)
确定了 ==
的第二个参数,而不是第一个。因此,它不仅仅是调用带有一个参数的 ==
。 - sepp2kfunc = (< 5)
或其他类似情况。此外,原文中使用了柯里化而非部分应用,因此无论如何都是错误的。 - Jeff Burka@
,表达式(@ x)
意味着(\y -> y @ x)
。(\y -> y == "000001")
,即一个接收字符串并判断其是否等于"000001"
的函数。(== arg)
或者 (arg ==)
是一个操作符部分应用(它也适用于其他操作符,不仅仅是==
)。它的作用是将操作符部分应用于给定的操作数。所以(== "foo")
等同于\x -> x == "foo"
。