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
的一个实例,假设 a
是 Ord
的一个实例。在这种情况下,列表按字典顺序排列。对于具有一个或多个元素的列表,这意味着我们按第一个元素排序:
maximumBy (comparing length <> flip (comparing (<b>take 1</b>))) sx
我比较列表的长度,然后比较第一个元素的大小,这样:
(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
的一个实例,假设 a
是 Ord
的一个实例。在这种情况下,列表按字典顺序排列。对于具有一个或多个元素的列表,这意味着我们按第一个元素排序:
maximumBy (comparing length <> flip (comparing (<b>take 1</b>))) sx