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 $ x
, f . g
f . g
是一个有意义的句法单位。
同时,在f $ g $ x
, f $ 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函数的做法。