簡體   English   中英

按 int (Haskell) 對 ('String', int) 的列表進行排序

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM