[英]Sorting a list of ('String', int) by its int (Haskell)
我是 Haskell 的新手,所以我還在學習很多東西。 我得到了一份姓名和年齡列表,我需要按字母順序和年齡遞增順序對它們進行排序。 我設法按字母順序對列表進行排序,但不確定如何使用其年齡值進行排序。 我可以在下面的代碼中更改什么? 謝謝您的幫助。
qsort :: (Ord a) => [a] -> [a]
-- check to see if the list is empty
qsort [] = []
qsort [x] = [x] -- Single element list is always sorted
qsort [x, y] = [(min x y), (max x y)]
-- x is the pivot, left quicksort returns smaller sorted and right quicksort bigger sorted
qsort (x:xs) =
qsort [a | a <- xs, a <= x] ++ [x] ++ qsort [a | a <- xs, a > x]
people=[("Steve",20),("Smith",31),("Kris",19),("Beth",21)]
main = do
print(qsort people) -- sort alphabetically
首先,讓我們稍微簡化一下您的 function。 [x]
和[x, y]
情況都是多余的:它們完全被(x:xs)
情況捕獲。 所以讓我們刪除那些。
qsort :: (Ord a) => [a] -> [a]
qsort [] = []
qsort (x:xs) =
qsort [a | a <- xs, a <= x] ++ [x] ++ qsort [a | a <- xs, a > x]
現在,目前我們假設我們的列表類型和我們排序的類型是相同的。 我們稱它們a
. 讓我們改為有兩種類型: a
將是我們列表的類型, b
將是我們要排序的類型。 只有b
必須滿足Ord
,我們需要一個 function 將a
轉換為b
,以便我們對列表進行排序。 這是我們想要的類型
qsort :: (Ord b) => (a -> b) -> [a] -> [a]
我們的基本情況基本相同,只是我們忽略了 function 參數。
qsort _ [] = []
在我們的遞歸案例中,我們通過應用 function f:: a -> b
然后使用<=
或>
進行比較。
qsort f (x:xs) =
qsort f [a | a <- xs, f a <= f x] ++ [x] ++ qsort f [a | a <- xs, f a > f x]
現在我們可以按我們想要的任何Ord
類型進行排序。 我們可以按元組的第一個元素排序
-- Note: (fst :: (a, b) -> a) is in Prelude
print (qsort fst people)
或第二個
-- Note: (snd :: (a, b) -> b) is in Prelude
print (qsort snd people)
兩者都按其自然排序順序。
如果我們想以相反的順序排序(降序而不是升序),我們可以使用Down
作為我們的 function。如果我們想按一些復雜的順序排序,我們總是可以使用newtype 模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.