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
minimumBymaximumBy 可能正在使用这些,或者至少试图与它们保持一致。

我猜原因是您可能会使用 min 和 max 来编写一个涉及比较和交换对的排序(如上面评论中的操作)。如果没有此属性,您可能会丢失元素并复制其他元素。

您通常无法观察到任何差异,因为比较相等的事物通常完全相同。但是您可以想象具有某种内部结构的元素,这些内部结构不会被比较考虑,但您不希望在排序过程中丢失。

10-08 17:42