请解释 Haskell 如何确定节、采用多个参数的函数和多个部分应用函数的优先级。有时,当整个表达式采用多个参数时,我发现很难弄清楚哪个部分函数将应用哪个参数。
这里有一些示例函数,但我确信不同的示例可能更具说明性。第一个摘自“带有效果的应用程序编程”一文。
sequence :: [IO a] → IO [a]
sequence [] = return []
sequence (c : cs) = return (:) `ap` c `ap` sequence cs
(.) (.)
(.) (.) (.)
是否有工具可以将此类表达式转换为 lambda 表达式形式?
最佳答案
括号中没有参数的运算符被视为普通标识符。因此 (+)
和 add
的行为方式完全相同。这意味着它以前缀形式使用,并且根本不会出现优先级问题。
考虑到这一点,我们可以想象编写以下内容:
compose = (.)
compose compose compose
后一个版本与使用 (.)
的令人困惑的版本相同。记住函数应用程序是右关联的,因此表达式与以下内容相同:
(compose compose) compose
带有参数的运算符部分,例如 (+ 1)
或 (1 +)
就优先级而言,其行为也与普通标识符一样。因此,如果您定义 next = (+ 1)
,两者的行为将相同。
就无点代码而言,pointful package 有一个命令行工具,它接受一个无点函数并尝试将其转换为一堆 lambda。您还可以使用 @unpl 从 #haskell IRC channel 上的 lambdabot 获取此功能。
你可以用 cabal 安装 pointful 并调用它:
cabal install pointful
pointful
关于haskell - 了解 Haskell 优先规则如何与多个部分应用程序配合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17243075/