在Haskell中表达长链组合

Dan*_*ton 11 haskell coding-style function-composition

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

我正在实施一个不同的版本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)
Run Code Online (Sandbox Code Playgroud)

这肯定会做很多额外的工作,但它应该是O(n log n)而不是原始nub的O(n 2).但这不是重点.问题是,它太长了!它真的不是那么复杂,但它很长(而且我是那些讨厌超过80列的人,或StackOverflow代码块上的水平滚动条).

(问题)

在Haskell中表达长链函数组合的更好方法是什么?

Don*_*art 17

分解线,并使用布局:

mynub = unsort 
      . map head 
      . groupBy ((==) `on` fst)
      . sortBy (comparing fst) 
      . rememberPosition
Run Code Online (Sandbox Code Playgroud)


lla*_*and 8

线宽很容易解决:)

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

但我几乎不习惯从右到左阅读作文.从上到下有点多.箭头或(>>>)=翻转(.)看起来更好,但我不知道它是否是惯用的

> mynub = { rememberPosition
>       >>> sortBy (comparing fst) 
>       >>> groupBy (\x y -> fst x == fst y) 
>       >>> map head 
>       >>> unsort 
>         }
Run Code Online (Sandbox Code Playgroud)

  • 为什么大括号? (7认同)