包括我在内的许多haskell程序员都喜欢无意义的风格,特别是在编写复杂的解析器时。它们使代码更具可读性和更简洁。但有时,它只是反过来(例如在滥用Monad
的实例和(->) a
的朋友时。)
请给我一些基本的指导,你什么时候认为毫无意义的风格是有用的,何时不是。例如,如果我不得不使用部分组合(类似flip ((.) . take) . drop
),我总是使用lambda。
答案 0 :(得分:14)
这显然是个人风格的问题。我认为无点样式是一种澄清您的想法的工具,将(->) a
视为Monad
而将(->)
视为Arrow
是一件好事,如果它能达到这个目的的话。
我可以想到一个人做,一个人不做:
(sort .) . (++)
最好写成\xs ys -> sort (xs ++ ys)
。Control.*
模块中的任何组合子,例如,使用curry (negate *** (+1))
作为(->)
和Arrow
使用ap (zipWith (+)) tail
写(->) [a]
作为Monad
。让共同控制类型的组合子参与的原因不仅仅是让你的意思清晰,而且它提醒你这些存在并且通常是有用的,不仅用于制作无点定义,而且用于解决问题。
与所有事情一样,应该注意不要过度。涉及太多组合函数的无点定义很快就会变得复杂。
答案 1 :(得分:12)
如果有疑问,只需使用(.)
撰写函数即可。不要介入翻转和交换(.) . (.)
s