Ord比较,但是returns最小的

Ord comparing, but returns the smallest one

我比较列表的长度,然后比较第一个元素的大小,这样:

(maximumBy (comparing length <> comparing head)) sx

此代码 return 最长的列表,如果有多个长度相同,它将 return 第一个元素最大的那个。

有没有一种简单的方法可以将其修改为 return 与 return 具有最小第一个元素的第二次比较?

这就是 Down newtype 存在的原因:反向排序。像这样使用它:

import Data.Ord

(maximumBy (comparing length <> comparing (Down . head))) sx

您可以使用 Down 来颠倒比较顺序:

import Data.Ord(Down(<b>Down</b>))

(maximumBy (comparing length <> comparing (<b>Down</b> . head))) sx

或者你可以在比较值的时候翻转两个操作数:

(maximumBy (comparing length <> <b>flip</b> (comparing head))) sx

话虽这么说,但您应该小心 comparing head。空列表没有 头部,因此如果您比较两个空列表,可能会导致错误。

您可以像 一样使用 take 1。这是有效的,因为列表 [a] 也是 Ord 的一个实例,假设 aOrd 的一个实例。在这种情况下,列表按字典顺序排列。对于具有一个或多个元素的列表,这意味着我们按第一个元素排序:

maximumBy (comparing length <> flip (comparing (<b>take 1</b>))) sx