顺序比较,但返回最小的

Blu*_*lue 12 comparison haskell max

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

(maximumBy (comparing length <> comparing head)) sx
Run Code Online (Sandbox Code Playgroud)

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

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

Wil*_*sem 13

您可以使用Downwhich 反转比较的顺序:

import Data.Ord(Down(Down))

(maximumBy (comparing length <> comparing (Down . head))) sx
Run Code Online (Sandbox Code Playgroud)

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

(maximumBy (comparing length <> flip (comparing head))) sx
Run Code Online (Sandbox Code Playgroud)

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

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

maximumBy (comparing length <> flip (comparing (take 1))) sx
Run Code Online (Sandbox Code Playgroud)

  • 避免空列表崩溃的建议:“比较(取 1)”。 (4认同)

Jos*_*ica 9

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

import Data.Ord

(maximumBy (comparing length <> comparing (Down . head))) sx
Run Code Online (Sandbox Code Playgroud)