(不重要的背景信息/动机)
我正在实施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(n 2 )。但这不是重点。问题是,它太长了!它真的不那么复杂,但它很长(而且我是那些讨厌超过80列的人,或StackOverflow代码块上的水平滚动条)。
(问题)
Haskell有什么更好的方法来表达这样的长链函数组合?
答案 0 :(得分:17)
分解线条,并使用布局:
mynub = unsort
. map head
. groupBy ((==) `on` fst)
. sortBy (comparing fst)
. rememberPosition
答案 1 :(得分:8)
线宽很容易解决:)
> mynub = { unsort
> . map head
> . groupBy (\x y -> fst x == fst y)
> . sortBy (comparing fst)
> . rememberPosition
> }
但我几乎不习惯从右到左阅读作文。从上到下有点多。 箭头或(>>>)=翻转(。)对我来说看起来更好,但我不知道它是不是惯用的
> mynub = { rememberPosition
> >>> sortBy (comparing fst)
> >>> groupBy (\x y -> fst x == fst y)
> >>> map head
> >>> unsort
> }