我比较列表的长度和第一个元素的大小,这样:
(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
的实例,假定a
是Ord
的实例。在这种情况下,列表是按字典顺序排列的。对于包含一个或多个元素的列表,这意味着我们按第一个元素排序:
maximumBy (comparing length <> flip (comparing (take 1))) sx
这就是Down
newtype
存在的原因:反向排序。这样使用:
import Data.Ord
(maximumBy (comparing length <> comparing (Down . head))) sx