mconcat (map comparing [length, last, id]) "abc" "def"
这当然不是类似的。该列表包含从相同域到不同codomains的功能。但我希望意图很明确。某些类型的注释或其他解决方法(不是在3个地方或类似的地方进行比较)可以使它工作吗?
答案 0 :(得分: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
这会利用函数的monoid实例(结果上的monoid)和Ordering
的{{1}}(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