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