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

Dun*_*son 1 haskell xmonad

我正在学习基本的Haskell,所以我可以配置Xmonad,我遇到了这段代码:

newKeys x  = myKeys x `M.union` keys def x
Run Code Online (Sandbox Code Playgroud)

现在我明白了M.union反引号的含义和含义.这就是我解释它的方式:

newKeys(x) = M.union(myKeys(x),???)
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么做keys def x.是keys(def(x))吗?还是keys(def,x)?或者是def某种其他关键字?

Fyo*_*kin 10

是的keys(def,x).

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

f x y = x + y
z = f 5 6 
-- z = 11
Run Code Online (Sandbox Code Playgroud)

但是,目前尚不清楚def没有更大背景的情况.

响应你的评论:不,def不能是一个x作为参数的函数,然后传递给它的结果keys.这是因为函数应用程序是左关联的,这基本上意味着在由空格分隔的任何事物中,只有第一个是被应用的函数,其余的是它的参数.为了表达keys(def(x)),人们必须写keys (def x).

如果你想成为超级技术人员,那么思考它的正确方法是所有功能都只有一个参数.当我们声明两个参数的函数时,例如f x y = x + y,我们真正的意思是它是一个参数的函数,它返回另一个函数,然后我们可以传递剩余的参数.换句话说,f 5 6意味着(f 5) 6.

这个想法是Haskell(以及任何ML offshoot)语法中的核心内容之一.它非常重要,它有自己的名字 - "currying"(在数学家Haskell Curry之后).

  • `def`来自[`data-default`](https://hackage.haskell.org/package/data-default-0.7.1.1/docs/Data-Default.html#v:def). (3认同)