Haskell函数组成(。)和函数应用($)成语:正确使用

我一直在阅读真实世界的Haskell ,而且我已经接近尾声,但风格的问题一直在与我(.)($)运算符做一个小问题。

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

 f = g . h 

但是,当你将这些function应用到最后时,我会这样写:

 k = a $ b $ c $ value 

但是这本书会这样写:

 k = a . b . c $ value 

现在,对我来说,他们看起来在function上是相同的,他们在我眼中完全一样。 然而,我看的越多,我就越是看到人们按照本书的方式编写自己的function:先用(.)编写,然后在最后使用($)来附加一个值来评估这个地段(没有人它与许多美元成分)。

是否有使用书籍方式比使用所有($)符号好得多的原因? 还是有没有一些最好的做法,我没有得到? 或者是多余的,我不应该担心它呢?

我想我可以从权威来回答这个问题。

是否有使用书籍方式比使用所有($)符号好得多的原因?

没有特别的理由 布莱恩和我都喜欢减less线路噪音。 .$更安静。 因此,本书使用f . g . h $ x f . g . h $ x f . g . h $ x语法。

它们确实是等价的:请记住, $操作符基本上什么也没有。 f $ x评估为fx$的目的是固定行为:右联合和最小优先。 删除$并使用括号来代替中缀优先级,代码片段如下所示:

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

 k = (a . b . c) value 

喜欢的原因.$版本上的版本是相同的原因,喜欢上面的括号以上的版本:审美吸引力。

虽然,有些人可能会怀疑,使用中缀运算符而不是括号是基于一些潜意识的冲动,以避免任何可能类似于Lisp(只是在开玩笑…我想?)。

我会在f . g $ x加上f . g $ x f . g $ xf . g f . g是一个有意义的句法单位。

同时,在f $ g $ xf $ g不是一个有意义的单位。 一个$的链可以说是更加必要的 – 首先得到x的结果g然后f然后去做它,等等。

同时一连串的. 可以说是更具说明性的,在某种意义上更接近以数据stream为中心的视图 – 组成一系列函数,并最终将它们应用于某些事物。

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

这个haskell-cafe线程有一个有趣的讨论。 显然有一个less数人的观点认为, $的正确结合性“显然是错误的” ,selectf . g . h $ x f . g . h $ x f . g . h $ x超过f $ g $ h $ x是解决问题的方法之一。

这只是一个风格问题。 但是,这本书的方式对我来说更有意义。 它构成了所有的function,然后将其应用于价值。

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

但是,这并不重要。 在Haskell中,通常有许多正确的方法来做同样的事情。

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

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

我认为作者偏好构图方法的原因是因为它导致了良好的构build函数的做法。