Haskell函数组合(.)和函数应用程序($)成语:正确使用

Rob*_*oli 124 haskell coding-style function-composition

我一直在阅读真实世界的哈斯克尔,我即将结束,但风格问题一直在与我(.)($)操作员徘徊.

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

f = g . h
Run Code Online (Sandbox Code Playgroud)

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

k = a $ b $ c $ value
Run Code Online (Sandbox Code Playgroud)

但是这本书会像这样写:

k = a . b . c $ value
Run Code Online (Sandbox Code Playgroud)

现在,对我来说,他们看起来功能相同,他们在我眼中完全一样.然而,我看的越多,我就越看到人们以书的方式编写他们的函数:(.)首先构成,然后仅在最后使用($)附加值来评估该批次(没有人用很多美元组成) .

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

Don*_*art 147

我想我可以从权威机构回答这个问题.

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

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

  • 不是不同意作者,但我认为在创造*某事物而不是*使用*它的心理模型中还有另一个更突出的原因.Haskell用户倾向于将`fgh`想象成一个新的聪明创作而不是`f(g(h()))`.现在,他们正在调用一个新的,虽然是匿名的函数,而不仅仅是链接一个像PHP用户这样的预装函数调用的大词典. (37认同)
  • 好吧,我不能指望比这个更好的答案; 来自其中一位作者本人.:)这是有道理的,当我阅读时,它在页面上看起来确实更安静.将此标记为答案,因为它直接回答了问题.感谢您的答复; 事实上,这本书. (3认同)
  • 这是一个有趣的陈述:“减少线路噪音”和“比”更安静。我从来没有想过这个术语中的编程语言,但它完全有道理。 (3认同)

C. *_*ann 53

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

k = a (b (c (value)))
Run Code Online (Sandbox Code Playgroud)

k = (a . b . c) value
Run Code Online (Sandbox Code Playgroud)

更喜欢.版本而不是$版本的原因与在上面的括号上的版本更喜欢这两者的原因相同:审美吸引力.

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


scl*_*clv 37

我补充说f . g $ x,f . g是一个有意义的句法单位.

同时,在f $ g $ x,f $ g不是一个有意义的单位.A链$可以说是更为迫切- 第一个得到的结果gx,然后f它,然后foo吧,然后

同时,一条链.可以说更具说明性,并且在某种意义上更接近以数据流为中心的视图 - 构成一系列函数,并最终将它们应用于某些东西.

  • 我正在学习Haskell(没有编写任何有意义的代码),但我喜欢将$视为一种“管道”运算符。它很像终端| 管道(数据流从右到左除外),但是像终端进程一样,每个单元都明确独立。 (2认同)

Ant*_*sky 18

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


Tra*_*own 13

这个haskell-cafe线程上有一个关于这个问题的有趣讨论.显然有这么认为的右联一个少数人的观点$"完全错误的",并选择f . g . h $ xf $ g $ h $ x是侧步进问题的一种方式.

  • 类似的论点:https://ghc.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity (2认同)