コンパレータのリストを受け入れ、最初のコンパレータを使用して値のペアを比較するコンパレータを返し、最初のコンパレータが返された場合は2番目のコンパレータを返す関数を作成しようとしていますEQ
。
私が思いついたのは次の機能でした:
import Data.Monoid
chainCompare :: [a -> a -> Ordering] -> a -> a -> Ordering
chainCompare = mconcat . map ($)
編集:次chainCompare
のように書くこともできます(指摘してくれたVitusに感謝します):
chaincompare = mconcat
この関数の使用例は次のとおりです。
import Data.List
import Data.Ord
sortBy (chainCompare [comparing length, comparing sum]) [[1..100], [1..20], [100..200]]
ただし、この関数は比較を明示的に使用する必要があるため、次のように関数を変更しようとしました。
chainCompare :: Ord b => [a -> b] -> a -> a -> Ordering
chainCompare = mconcat . map (comparing $)
ただし、chainCompare
この場合はコンパイル エラーが発生します (また、この例がコンパイルされたとしても、空の文字列では機能しません)。
sortBy (chainCompare [length, head]) [['a'..'z'], ['A'..'Z'], "Lorem ipsum dolor sit amet"]
任意の型にできるchainCompare
という意味でポリモーフィックにすることは可能ですか? 拡張機能を使用している Haskell コードをいくつか見て、それらを検索しようとしましたが、それぞれの特定の拡張機能が何に役立つのかまだわかりません。b
instance Ord
forall