首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据元组的第二个元素对元组列表进行排序,不使用高阶函数或递归。

根据元组的第二个元素对元组列表进行排序,不使用高阶函数或递归。
EN

Stack Overflow用户
提问于 2020-12-02 12:15:15
回答 2查看 176关注 0票数 2

我有一个(String, Int)对的列表,并且很难找到如何按照snd字段(Int)对列表进行排序。我不允许使用高阶函数或递归,这使它更加困难。

例如,我有

代码语言:javascript
复制
[("aaaaa", 5),("bghdfe", 6),("dddr",4)] 

想把它整理成

代码语言:javascript
复制
 [("dddr",4),("aaaaa", 5),("bghdfe", 6)].

编辑:我知道如果没有高阶函数,排序可能是不可能的,我真正需要的是找到具有最小长度的元素( snd字段),那么是否有一种方法可以找到最小数目,然后在该索引处取列表元素的fst字段?但是,如果这样做效果更好,我不确定如何找到这个最小数的索引。

EN

回答 2

Stack Overflow用户

发布于 2020-12-02 12:20:26

这个任务似乎是不可能的,因为在Haskell中,如果没有递归,就无法编写一个排序。这意味着,您必须使用sort,它通常类似于sortBy compare,因此您拥有它。

但是,如果允许您使用sort,则可以首先反转所有元组,对结果列表进行排序,并在结果中再次反转元组。这应该可以在几个嵌套的列表理解中完成,因此在技术上不需要更高级的函数。

在你给出更多细节后,我会

代码语言:javascript
复制
homework list = snd (minimum [ (s,f) | (f,s) <- list ])
票数 2
EN

Stack Overflow用户

发布于 2020-12-02 13:56:56

如果没有高阶函数或递归,从技术上讲,您所剩下的就是列表理解。因此我们定义

代码语言:javascript
复制
-- 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65107904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档