许多 haskell 程序员,包括我在内,都喜欢无意义的风格,尤其是在编写复杂的解析器时。它们使代码更具可读性和更少冗长。但有时,情况正好相反(例如,在滥用Monad
和朋友的实例时(->) a
)。
请给我一些基本的指导,你认为无意义的风格什么时候有用,什么时候没有。例如,如果我必须使用部分合成来代替(类似于flip ((.) . take) . drop
),我总是使用 lambda。
许多 haskell 程序员,包括我在内,都喜欢无意义的风格,尤其是在编写复杂的解析器时。它们使代码更具可读性和更少冗长。但有时,情况正好相反(例如,在滥用Monad
和朋友的实例时(->) a
)。
请给我一些基本的指导,你认为无意义的风格什么时候有用,什么时候没有。例如,如果我必须使用部分合成来代替(类似于flip ((.) . take) . drop
),我总是使用 lambda。
这显然是个人风格问题。我认为无点风格是一种澄清你的想法的工具,如果它符合这个目的,那么将其(->) a
视为 aMonad
和(->)
as anArrow
是一件好事。
我可以想到一种做和一种不做:
(sort .) . (++)
最好写\xs ys -> sort (xs ++ ys)
。Control.*
模块中的任何组合器,例如,写curry (negate *** (+1))
using (->)
as anArrow
和ap (zipWith (+)) tail
using (->) [a]
as a Monad
。使用来自常见控件类型的组合器的原因不仅是为了使您的含义清晰,而且还提醒您这些组合器存在并且通常很有用,不仅用于进行无点定义,还用于解决问题。
与所有事情一样,一个人应该小心不要过度使用它。涉及太多组合函数的无点定义很快就会变得复杂。
如果有疑问,只需用(.)
. 不要踏入翻转和交换和(.) . (.)
s