当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))
答案 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
minimumBy
和maximumBy
可能正在使用这些或者至少试图与它们保持一致。
我猜测的原因是你可能会使用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
应直接选择head
和maximum
last
然后