2017-03-08 45 views
2
mconcat (map comparing [length, last, id]) "abc" "def" 

这当然不typecheck。该列表包含从同一个域到不同的功能域的功能。但我希望这个意图很明确。可以使用某种类型的注释或另一种解决方法(不要将比较放在3个地方或类似的地方)使其起作用吗?地图比较非均质标准

+0

任何你想这样做的理由?这不是推荐的编写haskell代码的方法。 – Sibi

+0

我在示例中看过它(其中一些链接如下),以展示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

回答

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 

这利用了两种功能幺实例(对结果幺半群)和一个用于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