什么时候使用毫无意义的风格?

时间:2011-03-14 21:19:20

标签: haskell coding-style pointfree

包括我在内的许多haskell程序员都喜欢无意义的风格,特别是在编写复杂的解析器时。它们使代码更具可读性和更简洁。但有时,它只是反过来(例如在滥用Monad的实例和(->) a的朋友时。)

请给我一些基本的指导,你什么时候认为毫无意义的风格是有用的,何时不是。例如,如果我不得不使用部分组合(类似flip ((.) . take) . drop),我总是使用lambda。

2 个答案:

答案 0 :(得分:14)

这显然是个人风格的问题。我认为无点样式是一种澄清您的想法的工具,将(->) a视为Monad而将(->)视为Arrow是一件好事,如果它能达到这个目的的话。

我可以想到一个人做,一个人不做:

  • 不要用咖喱成分构成,它太复杂而无法解剖,例如,(sort .) . (++)最好写成\xs ys -> sort (xs ++ ys)
  • 使用标准Control.*模块中的任何组合子,例如,使用curry (negate *** (+1))作为(->)Arrow使用ap (zipWith (+)) tail(->) [a]作为Monad

让共同控制类型的组合子参与的原因不仅仅是让你的意思清晰,而且它提醒你这些存在并且通常是有用的,不仅用于制作无点定义,而且用于解决问题。

与所有事情一样,应该注意不要过度。涉及太多组合函数的无点定义很快就会变得复杂。

答案 1 :(得分:12)

如果有疑问,只需使用(.)撰写函数即可。不要介入翻转和交换(.) . (.) s