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
它反映了固定性$.你可以为两者做一个非常好的案例$并且$!具有错误的固定性.
我在haskell-prime中找到了2008年的一项建议,以使$和$!运算符左关联:
https://ghc.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity
对此提案只有一个论点:“这将破坏很多代码”。
相反,有四个参数支持左联想($),最后一个与您的参数相同,并被认为是最重要的。简而言之,它们是:
0)给定表达式f x y,使用两个应用程序,我们将能够编写f $ x $ y
1)现在,有右结合($),我们可以写f . g . h $ x为f $ 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)
| 归档时间: |
|
| 查看次数: |
413 次 |
| 最近记录: |