(无关紧要的背景信息/动机)

我正在实现nub的不同版本,这受使用Yesod book's discouragement的启发。

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

08-07 02:46