何时使用无意义样式?

14
许多 Haskell 程序员(包括我)喜欢无意义风格,尤其是在编写复杂的解析器时。它们使代码更易读且不冗长。但有时候,情况恰恰相反(例如,在滥用 Monad 和类似于 (->) a 的实例时)。
请给我一些基本指南,您认为何时使用无意义风格有用,何时不应使用。例如,如果必须使用部分组合,我总是使用 lambda 表达式(例如像 flip ((.) . take) . drop 这样的东西)。

17
“pointless”何时取代“point-free”成为指称这种编程风格的方式?我必须说,将自己的代码称为“pointless”真的很有趣。 - CodexArcanum
2
我认为这主要是因为在freenode:#haskell中,lambdabot称之为这个名字,大多数时候是作为一个幽默的观察,因为它确实会使代码变得不太易读。 - geekosaur
1
https://dev59.com/J3E95IYBdhLWcg3wE56C - sclv
https://dev59.com/XnNA5IYBdhLWcg3wfN2O - sclv
3
@CodexArcanum,我第一次看到“pointless”这个词是在《Haskell程序员的进化》一文中。链接为http://www.willamette.edu/~fruehr/haskell/evolution.html。 - sastanin
2个回答

14

显然这是个人风格的问题。我认为点无风格是澄清您的思想的工具,如果它能够达到这个目的,将 (->) a 视为 Monad(->) 视为 Arrow 是一个好的选择。

我能想到一个应该做和一个不应该做的事情:

  • 不要使用柯里化组合,它太复杂了,比如(sort .) . (++) 最好写成\xs ys -> sort (xs ++ ys)
  • 使用标准的 Control.* 模块中的任何组合子,例如,使用 (->) 作为 Arrowcurry (negate *** (+1)),以及使用 (->) [a] 作为 Monadap (zipWith (+)) tail

涉及标准控制类型中的组合子的原因不仅是使您的含义清晰,而且还提醒您这些存在并且通常很有用,不仅可用于制定无点定义,还可用于解决问题。

对于所有事情,都应小心谨慎,不要过度。一个包含太多组合函数的点无定义可能会变得非常复杂。


12

如果不确定,请使用(.)组合函数。不要涉及翻转、交换和(.).(.)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接