我想寫接受比較的列表,並返回一個比較,如果第一比較返回EQ
等如何編寫比較器鏈接函數?
將比較一對使用第一比較,然後第二個值的函數我想出了以下功能:
import Data.Monoid
chainCompare :: [a -> a -> Ordering] -> a -> a -> Ordering
chainCompare = mconcat . map ($)
編輯:chainCompare
也可以寫爲(感謝維圖斯指點出來):
chaincompare = mconcat
的examp使用此功能的文件如下:
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
多態在這個意義上說,b
可以是任何類型的instance Ord
?我已經看到一些使用forall
擴展的Haskell代碼,並嘗試搜索它們,但我仍然無法弄清每個特定擴展的用處。
'map($)= map id = id'(具有更多特殊類型),您的第一個'chainCompare'只是'mconcat'。 – Vitus 2013-02-13 00:23:56
@Vitus感謝您指出 – Alexandros 2013-02-13 00:31:26