136

我一直在阅读Real World Haskell,我已经接近尾声了,但是风格问题一直困扰着我与(.)and($)运算符有关。

当你编写一个由其他函数组成的函数时,你可以这样写:

f = g . h

但是当你在这些函数的末尾应用一些东西时,我会这样写:

k = a $ b $ c $ value

但是这本书会这样写:

k = a . b . c $ value

现在,在我看来,它们在功能上是相同的,在我看来它们做的事情完全相同。然而,我看的越多,我就越看到人们以书中的方式编写他们的函数:(.)首先组合,然后只在最后使用($)附加一个值来评估批次(没有人用很多美元组合来做) .

($)是否有理由使用比使用所有符号更好的书籍方式?还是这里有一些我没有得到的最​​佳实践?或者它是多余的,我根本不应该担心它?

4

7 回答 7

159

我想我可以从权威人士那里回答这个问题。

是否有理由使用比使用所有 ($) 符号更好的书籍方式?

没有什么特别的原因。Bryan 和我都喜欢减少线路噪音。.比 安静$。因此,本书使用了f . g . h $ x语法。

于 2010-06-13T01:49:04.947 回答
55

它们确实是等价的:请记住,$操作员基本上什么都不做。f $ x评估为f x。的目的$是它的固定行为:右关联和最小优先级。删除$并使用括号而不是中缀优先级进行分组,代码片段如下所示:

k = a (b (c (value)))

k = (a . b . c) value

喜欢这个.版本而不是$版本的原因与更喜欢上面括号中的版本的原因是一样的:审美吸引力。

虽然,有些人可能想知道使用中缀运算符而不是括号是否是基于某种潜意识的冲动,以避免与 Lisp 有任何可能的相似之处(开个玩笑……我想?)。

于 2010-06-13T02:08:07.227 回答
44

我要补充一点, inf . g $ xf . g一个有意义的句法单元。

同时,in f $ g $ xf $ g不是一个有意义的单位。链 of$可以说是更加必要的——首先得到 of 的结果gx然后对它f执行,然后对它执行foo然后等等。

同时,a chain of.可以说更具声明性,并且在某种意义上更接近以数据流为中心的视图——组合一系列函数,并最终将它们应用于某些东西。

于 2010-06-22T15:06:56.810 回答
19

对我来说,我认为答案是(a)整洁,正如唐所说的那样;(b) 我发现当我编辑代码时,我的函数可能以无点样式结束,然后我所要做的就是删除最后一个$,而不是返回并更改所有内容。一个小点,当然,但很好。

于 2010-06-13T02:45:52.933 回答
13

在这个 haskell-cafe thread上有一个关于这个问题的有趣讨论。显然,有少数观点认为,正确的关联性$“完全错误的”,而选择是回避问题f . g . h $ xf $ g $ h $ x一种方式。

于 2010-06-13T15:51:15.147 回答
3

这只是风格问题。然而,这本书的方式对我来说更有意义。它组合了所有函数,然后将其应用于值。

你的方法看起来很奇怪,最后一个$是不必要的。

不过,真的没关系。在 Haskell 中,通常有很多很多正确的方法来做同样的事情。

于 2010-06-13T01:02:50.053 回答
0

我意识到这是一个非常古老的问题,但我认为还有另一个尚未提及的原因。

如果您声明一个新的无点函数f . g . h,您传入的值将被自动应用。但是,如果您编写 f $ g $ h,它将无法正常工作。

我认为作者喜欢组合方法的原因是因为它导致了构建函数的良好实践。

于 2015-09-12T18:26:24.007 回答