[英]Haskell function composition (.) and function application ($) idioms: correct use
我一直在阅读Real World Haskell ,并且快要结束了,但是我一直在苦恼与(.)
和($)
运算符有关的风格问题。
当你编写一个由其他函数组成的函数时,你可以这样写:
f = g . h
但是当你在这些函数的末尾应用一些东西时,我是这样写的:
k = a $ b $ c $ value
但是这本书会这样写:
k = a . b . c $ value
现在,在我看来,它们在功能上是等效的,在我看来,它们的作用完全相同。 然而,我看得越多,我就越能看到人们以本书的方式编写函数:首先使用(.)
组合,然后仅在最后使用($)
附加一个值来评估批次(没有人这样做)它带有许多美元成分)。
是否有理由使用比使用所有($)
符号更好的书籍方式? 或者这里有一些我没有得到的最佳实践吗? 或者它是多余的,我根本不应该担心它?
我想我可以从权威那里回答这个问题。
是否有理由使用比使用所有 ($) 符号更好的书籍方式?
没有什么特别的原因。 Bryan 和我都喜欢减少线路噪音。 .
比$
更安静。 因此,本书使用了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
,然后对它做foo
,然后等等。
同时一连串的.
可以说更具声明性,并且在某种意义上更接近以数据流为中心的视图——组合一系列函数,并最终将它们应用于某些东西。
对我来说,我认为答案是 (a) 正如唐所说的那样整洁; (b) 我发现当我编辑代码时,我的函数可能会以无点样式结束,然后我要做的就是删除最后一个$
而不是返回并更改所有内容。 当然,这是一个小问题,但很好。
在这个 haskell-cafe thread上有一个关于这个问题的有趣讨论。 显然有少数观点认为$
的正确结合性是“完全错误的” ,并选择了f . g . h $ x
f . g . h $ x
f . g . h $ x
超过f $ g $ h $ x
是回避问题的一种方式。
这只是风格问题。 然而,这本书的方式对我来说更有意义。 它组合了所有函数,然后将其应用于值。
你的方法看起来很奇怪,最后一个$
是不必要的。
不过,这真的无所谓。 在 Haskell 中,通常有很多很多正确的方法可以做同样的事情。
我意识到这是一个非常古老的问题,但我认为还有另一个未提及的原因。
如果您要声明一个新的无点函数f . g . h
f . g . h
f . g . h
,您传入的值将被自动应用。 但是,如果您写f $ g $ h
,它将不起作用。
我认为作者更喜欢组合方法的原因是因为它导致构建函数的良好实践。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.