(不重要的背景信息/动机)
我正在实现nub
的不同版本,受到Yesod书中劝阻使用它的启发。
map head . group . sort
比调用nub
更有效。但是,对我们来说,顺序很重要。
所以我开始写一个"更好"的小块,类似于顺序不重要的版本。最后是这样的:
mynub = unsort . map head . groupBy (x y -> fst x == fst y) . sortBy (comparing fst) . rememberPosition
rememberPosition = flip zip [0..]
unsort = map fst . sortBy (comparing snd)
这当然做了很多额外的工作,但它应该是O(n log n)而不是原来的nub的O(n2)。但这不是重点。问题是太长了!它真的没有那么复杂,但是它很长(我是那些讨厌超过80列的人之一,或者在StackOverflow代码块上的水平滚动条)。
(的问题)在Haskell中有什么更好的方式来表达这样的长链函数组合?
分隔行,使用如下布局:
mynub = unsort
. map head
. groupBy ((==) `on` fst)
. sortBy (comparing fst)
. rememberPosition
行宽很容易解决:)
> mynub = { unsort
> . map head
> . groupBy (x y -> fst x == fst y)
> . sortBy (comparing fst)
> . rememberPosition
> }
但是我几乎不习惯从右向左看作文。从上到下有点多。Arrow或(>>>)=flip(.)对我来说看起来更好,但我不知道它是否符合习惯
> mynub = { rememberPosition
> >>> sortBy (comparing fst)
> >>> groupBy (x y -> fst x == fst y)
> >>> map head
> >>> unsort
> }