12

(不重要的背景信息/动机)

受Yesod 书不鼓励使用它的nub启发,我正在实施不同版本的.

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中有什么更好的方法来表达这样的长链函数组合?

4

2 回答 2

17

拆线,并使用布局:

mynub = unsort 
      . map head 
      . groupBy ((==) `on` fst)
      . sortBy (comparing fst) 
      . rememberPosition
于 2011-04-20T04:17:42.063 回答
8

线宽很容易解决:)

> mynub = { unsort 
>         . map head 
>         . groupBy (\x y -> fst x == fst y) 
>         . sortBy (comparing fst) 
>         . rememberPosition
>         }

但我几乎不习惯从右到左阅读作文。从上到下有点多。Arrow or (>>>)=flip (.) 对我来说看起来更好,但我不知道它是否是惯用的

> mynub = { rememberPosition
>       >>> sortBy (comparing fst) 
>       >>> groupBy (\x y -> fst x == fst y) 
>       >>> map head 
>       >>> unsort 
>         }
于 2011-04-20T04:16:42.450 回答