Byt*_*ter 2 sorting haskell types
mconcat (map comparing [length, last, id]) "abc" "def"
Run Code Online (Sandbox Code Playgroud)
这当然不是类似的.该列表包含从相同域到不同codomains的功能.但我希望意图很明确.某些类型的注释或其他解决方法(不是在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
Run Code Online (Sandbox Code Playgroud)
这会利用函数的monoid实例(结果上的一个monoid)和for Ordering(一个明显的东西).
鉴于您提供的投影函数的结果类型comparing实际上并未出现在最终结果中,如果您确实需要列表,则可以诉诸于存在类型:
{-# LANGUAGE GADTs #-}
import Data.Ord
data Measurement a where
Measurement :: Ord b => (a -> b) -> Measurement a
comparingHet :: Measurement a -> a -> a -> Ordering
comparingHet (Measurement f) = comparing f
Run Code Online (Sandbox Code Playgroud)
GHCi> criteria = [Measurement length, Measurement last, Measurement id]
GHCi> mconcat (comparingHet <$> criteria) "aac" "abc"
LT
GHCi> foldMap comparingHet criteria "aac" "abc" -- Alternative spelling.
LT
Run Code Online (Sandbox Code Playgroud)