我有一个(String, Int)对的列表,并且很难找到如何按照snd字段(Int)对列表进行排序。我不允许使用高阶函数或递归,这使它更加困难。
例如,我有
[("aaaaa", 5),("bghdfe", 6),("dddr",4)] 想把它整理成
[("dddr",4),("aaaaa", 5),("bghdfe", 6)].编辑:我知道如果没有高阶函数,排序可能是不可能的,我真正需要的是找到具有最小长度的元素( snd字段),那么是否有一种方法可以找到最小数目,然后在该索引处取列表元素的fst字段?但是,如果这样做效果更好,我不确定如何找到这个最小数的索引。
发布于 2020-12-02 12:20:26
这个任务似乎是不可能的,因为在Haskell中,如果没有递归,就无法编写一个排序。这意味着,您必须使用sort,它通常类似于sortBy compare,因此您拥有它。
但是,如果允许您使用sort,则可以首先反转所有元组,对结果列表进行排序,并在结果中再次反转元组。这应该可以在几个嵌套的列表理解中完成,因此在技术上不需要更高级的函数。
在你给出更多细节后,我会
homework list = snd (minimum [ (s,f) | (f,s) <- list ])发布于 2020-12-02 13:56:56
如果没有高阶函数或递归,从技术上讲,您所剩下的就是列表理解。因此我们定义
-- 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
[] -> Nothinghttps://stackoverflow.com/questions/65107904
复制相似问题