2014-05-09 43 views
3

我刚学Haskell和我还没有何时以及如何严格评价被迫

当我想要一个函数严格评估其论据完全清楚我发现自己写

((f $! x) $! y) $! z 

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

f $! x $! y $! z 

并让它做我想要的?

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

+1

为什么不用'$!'的反向固定性编写一个函数'!$'来实现你想要的功能? – bheklilr

+0

问题是为什么函数还没有以这种方式定义。我想知道,如果我这样写的愿望反映了对Haskell工作方式的误解。 – dspyz

+3

如果你刚刚学习Haskell,我认为你不应该搞严格的应用程序。这很少需要。 – augustss

回答

4

措施反对

我发现了一个建议,从2008年哈斯克尔贷,使$$!运营左结合:

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

只有一个反对这一提议的说法:“这会破坏代码“lot”。

论点支持

相反,给出有利于左结合($),最后一个是和你一样的四个参数,并认为是最重要的。他们是,总之:给定的表达式f x y,有两个应用

  • 0),我们将能够写f $ x $ y

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

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

    以便写入这种管道与组合物I因为它允许更容易地清除代码

  • 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 
+1

旧版(2006),Haskell Cafe中的类似讨论(他告诉:“$的结合性只是普通的错误“):http://www.mail-archive.com/[email protected]/msg12549.html – enrique

+0

要翻译常规样式'f $! g $!引用'$'的策略,需要一些严格的组合:'f。! g $! x'。我想知道:是否有这样的操作符已经在库中定义? –

+0

顺便说一下,目前的'<$>'与当前传统的'$'一致:'f <$> g''''似乎等于'f。 g <$> x'。但是,另一个“<$>”的左联合版本没有多大意义,因为消费了几个适用性参数被写为“f”或“f”或“f”或“f”应用'g')。看起来'<*>'已经是左联合的(就像Haskell-prime中的'$'),并且优先级低于'<$>'。 –

9

这是镜像$的固定性。对于$$!这两个错误的固定性,您都可以做出非常好的判断。

+0

什么是$?我搜索了“haskell运算符”,但没有任何第一对谷歌链接提到它(即使是包含haskell运算符列表的PDF文件)。我目前阅读的这本书也没有提到它(真实世界哈斯克尔)。是否有所有Haskell运算符的列表? – dspyz

+1

@dspyz http://stackoverflow.com/questions/940382/haskell-difference-between-dot-and-dollar-sign/1290727#1290727 –

+0

@dspyz你甚至会发现一个[链接到真正的世界哈斯克尔在托马斯的评论中评论它在书中的使用](http://stackoverflow.com/questions/3030675/haskell-function-composition-and-function-application-idioms-correct-us)。 – bheklilr

相关问题