簡體   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