[英]Sort a list of tuples by their second element without higher order functions or recursion
我有一个(String, Int)
对列表,正在努力弄清楚如何按snd
字段 ( Int
) 对列表进行排序。 我不允许使用高阶函数或递归,这使它变得更加困难。
例如,我有
[("aaaaa", 5),("bghdfe", 6),("dddr",4)]
并想将其分类为
[("dddr",4),("aaaaa", 5),("bghdfe", 6)].
编辑:我知道如果没有高阶函数,排序可能是不可能的,我真正需要的是找到最小长度的元素( snd
字段),所以有没有办法找到最小数字然后取fst
该索引处列表元素的字段? 如果这种方式效果更好,我不确定如何找到该最小数量的索引。
该任务似乎是不可能的,因为您不能在 Haskell 中编写没有递归的排序。这意味着,您必须使用sort
,这通常类似于sortBy compare
,因此您拥有它。
但是如果您被允许使用sort
,您可以通过首先反转所有元组,对结果列表进行排序并再次反转结果中的元组来实现。 这应该可以在一些嵌套列表理解中完成,因此从技术上讲不需要高阶函数。
在您提供更多详细信息后,我会做
homework list = snd (minimum [ (s,f) | (f,s) <- list ])
如果没有高阶函数或递归,从技术上讲,您所剩下的就是列表理解。 因此我们定义
-- sortBy (comparing snd) >>> take 1 >>> listToMaybe >>> fmap fst
-- ~= minimumBy (comparing snd) >>> fst
foo :: Ord b => [(a,b)] -> Maybe a
foo xs = case [ a | (a,b) <- xs
, null [ () | (_c,d) <- xs, d < b]]
of (a:_) -> Just a
[] -> Nothing
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.