为什么是$!运算符右关联?

dsp*_*pyz 4 haskell lazy-evaluation associativity

我只是在学习Haskell,而且我还不完全清楚何时以及如何严格评估

当我想要一个函数来严格评估它的参数时,我发现自己在写作

((f $! x) $! y ) $! z
Run Code Online (Sandbox Code Playgroud)

这看起来很奇怪.不应该$!是左联想所以我可以写

f $! x $! y $! z
Run Code Online (Sandbox Code Playgroud)

并让它做我想要的?

我完全误解了$!运营商?

aug*_*tss 11

它反映了固定性$.你可以为两者做一个非常好的案例$并且$!具有错误的固定性.

  • @dspyz FP Complete的Hoogle搜索比常规Hoogle更多的包,所以它可以很方便https://www.fpcomplete.com/hoogle (3认同)

enr*_*que 5

反对

我在haskell-prime中找到了2008年的一项建议,以使$$!运算符左关联:

https://ghc.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity

对此提案只有一个论点:“这将破坏很多代码”。

赞成的论点

相反,有四个参数支持左联想($),最后一个与您的参数相同,并被认为是最重要的。简而言之,它们是:

  • 0)给定表达式f x y,使用两个应用程序,我们将能够编写f $ x $ y

  • 1)现在,有右结合($),我们可以写f . g . h $ xf $ g $ h $ x

    但是:\x -> f $ g $ h $ x ==> f $ g $ h无效,

    以便更好地编写带有组合的此类管道,因为这样可以更轻松地清理代码

  • 2)左联想($)除了用(。)消除的括号外,还可以消除更多的括号,例如:

    f (g x) (h y) ==> f $ g x $ h y

  • 3)你的论点:右侧关联版本$!是不方便的,因为引起了诸如:((f $! x) $! y) $! z代替f $! x $! y $! z

结论

我支持使用更好的应用程序运算符的左关联版本,在我们的代码开头重新定义它们,如下所示:

import Prelude hiding (($), ($!))

infixl 0  $, $!
($), ($!) :: (a -> b) -> a -> b  
f $  x =         f x
f $! x = x `seq` f x
Run Code Online (Sandbox Code Playgroud)

  • Older(2006),在Haskell Cafe中进行了类似的讨论(他说:“ $的关联性是完全错误的”):http://www.mail-archive.com/haskell-cafe@haskell.org/msg12549.html (2认同)