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

這當然不typecheck。該列表包含從同一個域到不同的功能域的功能。但我希望這個意圖很明確。可以使用某種類型的註釋或另一種解決方法(不要將比較放在3個地方或類似的地方)使其起作用嗎?地圖比較非均質標準

+0

任何你想這樣做的理由?這不是推薦的編寫haskell代碼的方法。 – Sibi

+0

我在示例中看過它(其中一些鏈接如下),以展示Ordering monoid。這讓我想知道比較的重複是否可以被抽象出來。我在我和其他人的節目中遇到過類似的情況,與排序無關。 附加問題,由第二句提示:在這種情況下推薦的方法是什麼? http://www.mjoldfield.com/atelier/2015/04/monoid.html https://byorgey.wordpress.com/2011/04/18/monoids-for-maybe/ http:// martijn .van.steenbergen.nl /日記/ 2008/12/21 /比較-多標準/ – 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)。

既然你給comparing投影功能的結果類型實際上並沒有出現在最終的結果,如果你真的你可以向一個存在的類型的列表:

{-# LANGUAGE GADTs #-} 

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

comparingHet :: Measurement a -> a -> a -> Ordering 
comparingHet (Measurement f) = comparing f 
GHCi> criteria = [Measurement length, Measurement last, Measurement id] 
GHCi> mconcat (comparingHet <$> criteria) "aac" "abc" 
LT