当 Data.List.minimumBy
遇到相等的列表元素时,它选择第一个,但 maximumBy
选择最后一个:
> import Data.List
> import Data.Ord
> minimumBy (const (const EQ)) "Hello world!"
'H'
> maximumBy (const (const EQ)) "Hello world!"
'!'
这是有意为之还是巧合?这种行为背后有什么好的理由吗?
请注意,利用这种假设可以使代码更加简洁 - 即
minimumOn length texts
而不是使用显式的决胜局,例如 map snd (minimumOn (\(p, t) -> (length t, p)) (zip [0..] texts))
最佳答案
在 Haskell report 中有关于 min 和 max 的注释:
-- note that (min x y, max x y) = (x,y) or (y,x)
max x y
| x <= y = y
| otherwise = x
min x y
| x <= y = x
| otherwise = y
minimumBy
和 maximumBy
可能正在使用这些,或者至少试图与它们保持一致。我猜原因是您可能会使用 min 和 max 来编写一个涉及比较和交换对的排序(如上面评论中的操作)。如果没有此属性,您可能会丢失元素并复制其他元素。
您通常无法观察到任何差异,因为比较相等的事物通常完全相同。但是您可以想象具有某种内部结构的元素,这些内部结构不会被比较考虑,但您不希望在排序过程中丢失。