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