部分应用函数-第二个参数周围的括号



我实现了Learn You a Haskell中的一个练习。

isUpperCase' :: Char -> Bool
isUpperCase' = (`elem` ['A'..'Z'])

据我所知,(elem ['A'..'Z'])是一个部分应用的函数。调用isUpperCase' 'B'导致调用isUpperCase apply 'B',从而导致True

请注意,如果没有括号,将出现以下编译时错误:

*Main> :l IsUpperCase.hs
[1 of 1] Compiling Main             ( IsUpperCase.hs, interpreted )
IsUpperCase.hs:3:16: parse error on input ``'
Failed, modules loaded: none.

用括号包围部分应用函数的原因是什么?

事实上,函数被``包围。

在haskell中,foo `bar` bazbar foo baz完全相同。它将前缀函数应用程序转换为中缀运算符。

就像其他运算符一样,我们可以使用像(2 *)这样的分段。在这种情况下,

(`elem` ['A'..'Z'])
a -> a `elem` ['A'..'Z']
a -> elem a ['A' .. 'Z']
flip elem ['A' .. 'Z']

这只是避免编写flip的一种聪明(巧妙)的方法。你所拥有的相当于

isUpperCase' = flip elem ['A' .. 'Z']