haskell - 了解 Haskell 优先规则如何与多个部分应用程序配合使用

标签 haskell

请解释 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/

相关文章:

haskell - Haskell 中的运行长度编码

haskell - 如何在 Haskell 中获取可执行文件的目录?

haskell - Haskell代码中反斜杠的含义?

haskell - 如何轻松应对Haskell上的类型系统?

haskell - 诊断并行 monad 性能

Haskell - 搜索元组列表,返回第二个元素

windows - haskell 中的 win32 SetForegroundWindow

algorithm - Haskell 中的置换算法

haskell - 如何与更高级别的类型合作

performance - 在 Haskell 中使用列表生成器生成内存高效的代码