编码风格——在Haskell中表达长链的组合



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

我正在实现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 
>         }

最新更新