minimumBy和maximumBy之间不一致

时间:2017-07-25 13:00:20

标签: haskell

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))

2 个答案:

答案 0 :(得分:14)

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来编写一个涉及比较和交换对的排序(如上面评论中的操作)。如果没有此属性,您可能会丢失元素并将其他元素重复。

你通常无法观察到任何差异,因为比较相等的东西通常是完全相同的。但是你可以想象,具有某种内部结构的元素不是通过比较来考虑的,而是你不希望在排序中丢失。

答案 1 :(得分:3)

除了大卫弗莱彻的观点(并与之相关),我认为这种行为是为了保持不变

minimum l ≡ head (sort l)
maximum l ≡ last (sort l)

也在其概括中

minimumBy c l ≡ head (sortBy c l)
maximumBy c l ≡ last (sortBy c l)

...即使c在行为上与const (const EQ)相似。由于sort是稳定的,这意味着只需将列表保持原样,因此minimum应直接选择headmaximum last然后