Data.Semigroup ((<>)) 在这个 Haskell 排序代码中做了什么?
What does Data.Semigroup ((<>)) do in this Haskell sort code?
程序可以按制造商或年份对列表进行排序。什么是 (<>)?
import Data.Semigroup ((<>))
compare = comparing year <> comparing mfg
.
.
.
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
程序可以按制造商或年份对列表进行排序。什么是 (<>)?
import Data.Semigroup ((<>))
compare = comparing year <> comparing mfg
.
.
.
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