Ord比较,但返回最小的一个



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

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

此代码返回最长的列表,若有多个长度相同的列表,它将返回第一个元素最大的列表。

有没有一种简单的方法可以修改它,返回第二个比较,返回第一个元素最小的比较?

您可以使用Down来反转比较顺序:

import Data.Ord(Down(Down))
(maximumBy (comparing length <> comparing (Down. head))) sx

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

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

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

正如@DanielWagner所说,你可以使用take 1。这是因为列表[a]也是Ord的实例,假定aOrd的实例。在这种情况下,列表是按字典顺序排列的。对于包含一个或多个元素的列表,这意味着我们按第一个元素排序:

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

这就是Downnewtype存在的原因:反向排序。这样使用:

import Data.Ord
(maximumBy (comparing length <> comparing (Down . head))) sx

相关内容

  • 没有找到相关文章