我知道程序可以按制造商或年份(降序(对列表进行排序。第9行和第10行对此进行了定义。但是代码到底在做什么呢?什么是(<>(?
import Data.Semigroup ((<>))
import Data.List (sort, sortOn)
import Data.Ord (comparing)
data Vehicle = Vehicle { mfg :: String, year :: Int } deriving (Eq, Show)
mycars =[Vehicle "Saab" 2000, Vehicle "Volvo" 1995]
instance Ord Vehicle where
compare = flip (comparing year) <> comparing mfg
main = do
print $ sortOn mfg mycars
print $ sort mycars
import Data.Semigroup ((<>))
在您的程序中没有做任何有用的事情,自2015年发布GHC 7.10以来也没有做过。在此之前,它将<>
运算符引入作用域,以便compare = flip (comparing year) <> comparing mfg
可以使用它。在GHC 7.10中,该运算符已添加到Prelude中,因此即使不导入它,它现在也始终处于作用域中。
至于<>
在那里做什么,您在类型Vehicle -> Vehicle -> Ordering
中使用它。它来自Semigroup b => Semigroup (a -> b)
实例(两次(和Semigroup Ordering
实例。净效果是,在将两个Vehicles
应用于它之后,它将对它们使用左侧比较的结果(flip (comparing year)
(,除非它是EQ
,在这种情况下,它将改为对它们使用右侧比较(comparing mfg
(。如果你要手写出它到底在做什么,它会是这样的:
compare x y = case flip (comparing year) x y of
LT -> LT
EQ -> comparing mfg x y
GT -> GT