12

(重要でない背景情報 / 動機)

私は、イェソドの本の使用を思いとどまらせ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)

これは確かに多くの余分な作業を行いますが、元の nub の O(n 2 )ではなく O(n log n) にする必要があります。しかし、それは論外です。問題は、それがとても長いことです!それほど複雑ではありませんが、長いです (私は 80 列よりも幅が広い、または StackOverflow コード ブロックの水平スクロールバーが嫌いな人の 1 人です)。

(質問)

このような関数構成の長いチェーンを表現するための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
>         }

しかし、文章を右から左に読むことにほとんど慣れていません。上から下は少し多めです。矢印または (>>>)=flip (.) の方が見栄えがしますが、それが慣用的なものかどうかはわかりません

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