36

あるプロパティで並べ替え、次に別のプロパティで並べ替えたい (最初のプロパティが同じ場合)。

2 つの比較関数を構成する Haskell の慣用的な方法、つまり で使用される関数はsortBy何ですか?

与えられた

f :: Ord a => a -> a -> Ordering
g :: Ord a => a -> a -> Ordering

構成するfと、次のようにgなります。

h x y = case v of
          EQ -> g x y
          otherwise -> v
        where v = f x y
4

2 に答える 2

54

Monoidvitus はforの非常にクールなインスタンスを指摘していますOrdering。それをインスタンスと組み合わせると、instance Monoid b => Monoid (a -> b)合成関数は(準備ができている)だけであることがわかります。

mappend

見てみな:

Prelude Data.Monoid> let f a b = EQ
Prelude Data.Monoid> let g a b = LT
Prelude Data.Monoid> :t f `mappend` g
f `mappend` g :: t -> t1 -> Ordering
Prelude Data.Monoid> (f `mappend` g) undefined undefined 
LT
Prelude Data.Monoid> let f a b = GT
Prelude Data.Monoid> (f `mappend` g) undefined undefined 
GT

+1 強力でシンプルな抽象化

于 2012-07-14T19:16:39.333 に答える