Haskell 中的这个表达式是什么,我该如何解释它?

What is this expression in Haskell, and how do I interpret it?

我正在学习基础知识 Haskell 这样我就可以配置 Xmonad,并且我 运行 进入了这个代码片段:

newKeys x  = myKeys x `M.union` keys def x

现在我明白反引号中的 M.union 是什么意思了。以下是我的解释:

newKeys(x) = M.union(myKeys(x),???)

我不知道 keys def x 是怎么回事。像keys(def(x))吗?还是keys(def,x)?还是 def 某种其他关键字?

keys(def,x)

这是函数应用的基本 Haskell 语法:首先是函数本身,然后是用空格分隔的参数。例如:

f x y = x + y
z = f 5 6 
-- z = 11

但是,如果没有更大的上下文,则不清楚 def 是什么。

回应您的评论:不,def 不能是一个以 x 作为参数的函数,然后将其结果传递给 keys。这是因为函数应用是左结合的,这基本上意味着在任何由空格分隔的东西中,只有第一个是被应用的函数,其余的都是它的参数。为了表达keys(def(x)),必须写成keys (def x).

如果你想技术超群,那么正确的思考方式是所有的函数只有一个参数。当我们声明一个有两个参数的函数时,例如f x y = x + y,我们真正的意思是它是一个参数的函数,returns 另一个函数,然后我们可以将剩余的参数传递给它。换句话说,f 5 6 意味着 (f 5) 6

这个想法是 Haskell(以及任何 ML 分支)语法中的核心内容之一。它是如此重要以至于它有自己的名字——"currying"(在数学家 Haskell Curry 之后)。