2012-07-14 5 views
34

(最初のプロパティが同じ場合。)私は別のことで、その後1つのプロパティでソートしたいのですがは2つの比較関数を構成していますか?

sortByで使用する、すなわち機能2つの比較機能を構成するのはHaskellでの慣用の方法は何ですか?

考える

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

構成fgがもたらすであろう:

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

強力かつシンプルな抽象化のための

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:

mappend 

はそれをチェックアウト:あなたはインスタンスとそれを組み合わせる場合instance Monoid b => Monoid (a -> b)それはあなたの合成機能は、(準備)だけで判明します'Data.Monoid'では、' fxy \ 'mappend \' gxy'を得ることができます。 – Vitus

答えて

51

ヴィートはOrderingためMonoidの非常にクールなインスタンスを指摘しています。使用

+4

うわー...それは素晴らしいです。 – huon

+0

私はハスケルがこれに対してエレガントな解決策を持っていなければならないことを知っていました:)それをとても簡潔かつ簡潔に説明していただきありがとうございます。 –

+0

これは素晴らしいです。ペアのリストをソートするには 'sortBy(sstを比較するfst <>を比較する)' – dcastro

関連する問題