2017-03-08 4 views
2
mconcat (map comparing [length, last, id]) "abc" "def" 

これはもちろん型チェックしません。このリストには、同じドメインから異なるコードドメインへの関数が含まれています。しかし、その意図がはっきりしていることを願っています。注釈や別の回避策を入力することができますか?異種基準を比較したマップ

+0

このようにしたい理由は何ですか?これは、haskellコードを書くための推奨された方法ではありません。 – Sibi

+0

私はOrdering monoidを展示している例(以下にリンクされているもののいくつか)で見ました。私は比較の繰り返しを抽象化できるかどうか疑問に思います。私は鉱山や他のプログラムで同様のケースを見つけました。ソートには関係ありません。 2番目の文でプロンプトが表示される追加の質問:そのような場合に推奨される方法は何ですか? http://www.mjoldfield.com/atelier/2015/04/monoid.html https://byorgey.wordpress.com/2011/04/18/monoids-for-maybe/ http:// martijn .van.steenbergen.nl/journal/2008/12/21/comparison-multiple-criteria / – ByteEater

答えて

7

それは限り、あなたは、リスト内の関数を入れていない気にしないよう、非常にスムーズに行く:

GHCi> :t comparing length <> comparing last <> comparing id 
comparing length <> comparing last <> comparing id 
    :: Ord a => [a] -> [a] -> Ordering 
GHCi> (comparing length <> comparing last <> comparing id) "abcd" "abc" 
GT 
GHCi> (comparing length <> comparing last <> comparing id) "abd" "abc" 
GT 
GHCi> (comparing length <> comparing last <> comparing id) "aac" "abc" 
LT 

この機能のためのモノイドインスタンス(結果に対するモノイド)と、いずれかの両方を利用Ordering(これはthe intuitvely obvious thingです)。

{-# LANGUAGE GADTs #-} 

data Measurement a where 
    Measurement :: Ord b => (a -> b) -> Measurement a 

comparingHet :: Measurement a -> a -> a -> Ordering 
comparingHet (Measurement f) = comparing f 
:あなた 本当にはあなたが実存タイプにアピールすることができ、リストをしたい場合は、 comparingに与える投影関数の結果の型は、実際に、最終的な結果に表示されていないことを考えると

GHCi> criteria = [Measurement length, Measurement last, Measurement id] 
GHCi> mconcat (comparingHet <$> criteria) "aac" "abc" 
LT 
関連する問題