Data.Semigroup ((<>)) 在这个 Haskell 排序代码中做了什么?



我知道程序可以按制造商或年份(降序(对列表进行排序。第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

相关内容

  • 没有找到相关文章

最新更新