了解Haskell优先级规则如何与多个部分应用程序一起使用

Rum*_*mca 3 haskell

请解释Haskell如何确定优先级的部分,带有多个参数的函数和多个部分应用的函数.有时我发现很难弄清楚当整个表达式采用多个参数时,哪个部分函数会应用哪个参数.

以下是一些示例函数,但我确定不同的示例可能更具说明性.第一部分来自"有效的应用程序设计"一文.

sequence :: [IO a] ? IO [a]
sequence [] = return []
sequence (c : cs) = return (:) `ap` c `ap` sequence cs

(.) (.)
(.) (.) (.)
Run Code Online (Sandbox Code Playgroud)

有没有工具将这些表达式转换为lambda表达式?

Tik*_*vis 8

括号中没有参数的运算符被视为普通标识符.所以(+),add行为完全一样.这意味着它以前缀形式使用,并且不会出现优先级问题.

考虑到这一点,我们可以想象写下面的内容:

compose = (.)
compose compose compose
Run Code Online (Sandbox Code Playgroud)

后一版本与使用的混淆版本相同(.).它有助于记住函数应用程序是正确关联的,因此表达式与以下内容相同:

(compose compose) compose
Run Code Online (Sandbox Code Playgroud)

具有参数的运算符部分,就优先级而言,(+ 1)或者(1 +)也表现得像普通标识符一样.因此,如果您定义next = (+ 1),两者的行为都相同.

至于无点代码,有点包有一个命令行工具,它采用无点函数并试图将它变成一堆lambdas.您还可以使用@unpl在#haskell IRC频道上从lambdabot获取此功能.

您可以使用cabal安装有意义并调用它:

cabal install pointful
pointful
Run Code Online (Sandbox Code Playgroud)

  • @Rumca在Haskell中,每个函数只需要一个参数.有些像`compose`,然后返回一个带有另一个参数的函数. (6认同)