繁体   English   中英

在没有高阶函数或递归的情况下按第二个元素对元组列表进行排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM