请解释Haskell如何确定优先级的部分,带有多个参数的函数和多个部分应用的函数.有时我发现很难弄清楚当整个表达式采用多个参数时,哪个部分函数会应用哪个参数.
以下是一些示例函数,但我确定不同的示例可能更具说明性.第一部分来自"有效的应用程序设计"一文.
sequence :: [IO a] ? IO [a]
sequence [] = return []
sequence (c : cs) = return (:) `ap` c `ap` sequence cs
(.) (.)
(.) (.) (.)
Run Code Online (Sandbox Code Playgroud)
有没有工具将这些表达式转换为lambda表达式?
括号中没有参数的运算符被视为普通标识符.所以(+),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)