我一直在阅读真实的世界Haskell,我即将结束,但是风格的问题一直在徘徊我和 (.)
和 ($)
运算符 .
当你编写一个由其他函数组成的函数时,你可以这样写:
f = g . h
但是当你在这些函数的末尾应用某些东西时,我会这样写:
k = a $ b $ c $ value
但是这本书会像这样写:
k = a . b . c $ value
现在,对我来说,他们看起来功能相同,他们在我眼中完全一样 . 然而,我看的越多,我就越看到人们以书的方式编写他们的函数:首先用 (.)
组合然后只在最后使用 ($)
附加一个值来评估该批次(没有人用很多美元来做组合物) .
是否有理由使用比使用所有 ($)
符号更好的书籍方式?或者这里有一些我没有得到的最佳实践?或者它是多余的,我根本不应该担心它?
7 回答
我想我可以从权威机构回答这个问题 .
没有特别的理由 . 布莱恩和我都喜欢减少线路噪音 .
.
比$
更安静 . 因此,本书使用f . g . h $ x
语法 .它们确实是等价的:请记住,
$
运算符基本上没有 .f $ x
评估为f x
.$
的目的是它的固定行为:右关联和最小优先 . 删除$
并使用括号进行分组而不是中缀优先级,代码片段如下所示:和
更喜欢
.
版本而不是$
版本的原因与上述基于括号的版本更喜欢两者的原因相同:审美吸引力 .虽然,有些人可能想知道使用中缀运算符而不是括号是基于一些潜意识的冲动,以避免任何可能与Lisp相似(只是开玩笑......我想?) .
我在
f . g $ x
中添加,f . g
是一个有意义的语法单元 .同时,在
f $ g $ x
中,f $ g
不是一个有意义的单位 . 一条链$
可以说更为迫切 - 首先得到g
的g
的结果,然后对它做f
,然后对它做foo
,然后等等 .同时,
.
链可以说更具说明性,并且在某种意义上更接近以数据流为中心的视图 - 构成一系列函数,并最终将它们应用于某些东西 .对我来说,我认为答案是(a)整洁,如Don said; (b)我发现当我编辑代码时,我的函数可能会以无点样式结束,然后我所要做的就是删除最后的
$
而不是返回并更改所有内容 . 当然,这是一个小问题,但是非常精确 .在this haskell-cafe thread上有一个关于这个问题的有趣讨论 . 显然,有一个少数观点认为
$
的正确关联性是"just plain wrong",选择f . g . h $ x
而不是f $ g $ h $ x
是解决问题的一种方法 .这只是一种风格问题 . 然而,这本书的方式对我来说更有意义 . 它组成所有函数,然后将其应用于值 .
你的方法看起来很奇怪,最后的
$
是不必要的 .但是,这没关系 . 在Haskell中,通常有很多很多正确的方法来做同样的事情 .
我意识到这是一个非常古老的问题,但我认为还有其他原因尚未提及 .
如果要声明新的无点函数
f . g . h
,则会自动应用传入的值 . 但是,如果你写f $ g $ h
,它将无法正常工作 .我认为作者更喜欢构图方法的原因是因为它导致了构建函数的良好实践 .