2
mconcat (map comparing [length, last, id]) "abc" "def"
これはもちろん型チェックしません。このリストには、同じドメインから異なるコードドメインへの関数が含まれています。しかし、その意図がはっきりしていることを願っています。注釈や別の回避策を入力することができますか?異種基準を比較したマップ
mconcat (map comparing [length, last, id]) "abc" "def"
これはもちろん型チェックしません。このリストには、同じドメインから異なるコードドメインへの関数が含まれています。しかし、その意図がはっきりしていることを願っています。注釈や別の回避策を入力することができますか?異種基準を比較したマップ
それは限り、あなたは、リスト内の関数を入れていない気にしないよう、非常にスムーズに行く:
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
このようにしたい理由は何ですか?これは、haskellコードを書くための推奨された方法ではありません。 – Sibi
私は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