2
mconcat (map comparing [length, last, id]) "abc" "def"
這當然不typecheck。該列表包含從同一個域到不同的功能域的功能。但我希望這個意圖很明確。可以使用某種類型的註釋或另一種解決方法(不要將比較放在3個地方或類似的地方)使其起作用嗎?地圖比較非均質標準
mconcat (map comparing [length, last, id]) "abc" "def"
這當然不typecheck。該列表包含從同一個域到不同的功能域的功能。但我希望這個意圖很明確。可以使用某種類型的註釋或另一種解決方法(不要將比較放在3個地方或類似的地方)使其起作用嗎?地圖比較非均質標準
它去比較順利,只要你不介意不把功能列表:
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
任何你想這樣做的理由?這不是推薦的編寫haskell代碼的方法。 – Sibi
我在示例中看過它(其中一些鏈接如下),以展示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