gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:26:27 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com