对于可能会说"在教科书中查找"或"Hoogle it"的秃鹰,我做到了.
我发现了这个说法
recipe = (== "000001")
它对我来说看起来像某种布尔,但我不确定.我试过在GHCi中以不同的方式测试它,但我无法找出任何有用的东西.有人可以解释它意味着什么,这个问题将成为下一次有人谷歌Haskell(=="")的结果
这是一个部分.它相当于recipe = \x -> x == "000001"
(反过来又相同recipe x = x == "000001"
).
你可以GHCI
用来计算这个.
在GHCI
,投入let recipe = (== "000001")
.现在我们可以看到它是如何工作的.试着:t recipe
看看是什么类型.返回recipe :: [Char] -> Bool
,所以看起来这是一个获取Char
s(a String
)列表并返回a 的函数Bool
.
如果你测试它,你会发现它返回False
任何输入,除了"000001"
.
既然==
是一个运算符,你可以将它部分地应用于一个参数,它将返回一个接受另一个参数并返回结果的函数.所以这里== "000001"
返回一个函数,它接受一个参数来填充另一侧==
并返回结果.
编辑:如果定义是recipe = ((==) "000001")
这样的解释是正确的.
要理解这一点,您应该查找部分应用程序.==
函数的类型是a -> a -> Bool
一个函数,它接受两个相同类型的参数并返回一个Bool
.
但它也是类型的函数a -> (a -> Bool)
,它接受一个类型的参数a
并返回带有签名的新函数a -> Bool
.这就是这里发生的事情.我们提供了一个参数==
,因此它返回了一个新的类型函数a -> Bool
,或者[Char] -> Bool
在这种特殊情况下.
对于二元运算符@
,表达式(@ x)
意味着(\y -> y @ x)
.
在你的情况下,它将是(\y -> y == "000001")
ie.接受String的函数,并说它是否等于"000001"
.
(== arg)
或者(arg ==)
是一个操作员部分(它也适用于其他操作员 - 不仅仅是==
).它的作用是将运算符部分应用于给定的操作数.所以(== "foo")
是一样的\x -> x == "foo"
.