我正在尝试编写一个函数,该函数接受比较器列表并返回一个比较器,该比较器将使用第一个比较器比较一对值,然后如果第一个比较器返回,则使用第二个比较器EQ
等。
我想出的是以下功能:
import Data.Monoid
chainCompare :: [a -> a -> Ordering] -> a -> a -> Ordering
chainCompare = mconcat . map ($)
编辑:chainCompare
也可以写成(感谢 Vitus 指出):
chaincompare = mconcat
使用此功能的示例如下:
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
的意义上进行多态?我已经看到一些使用扩展的 Haskell 代码并尝试搜索它们,但我仍然无法弄清楚每个特定扩展的用途。b
instance Ord
forall