簡體   English   中英

QuickSort 應用於 Haskell 中的元組列表 (Int,[Int])

[英]QuickSort applied to a list of tuples (Int,[Int]) in Haskell

下午好,

我是 Haskell 的新手,我正在嘗試調整我制作的 QuickSort 算法,以使用元組列表對“Int”列表進行排序,但我完全不知道如何將尾部綁定到“a”讓它按照我的需要工作,或者是否可以重用代碼。 這是我用來對“Int”列表進行排序的內容:

quickSort :: Ord a => [a] -> [a]
quickSort [] = []  
quickSort (x:xs) =   
let smallSort  = quickSort [a | a <- xs, a < x]  
    biggerSort = quickSort [a | a <- xs, a > x]  
in  smallSort ++ [x] ++ biggerSort

這是我試圖用它做的,所以我可以對元組列表(Int,[Int])進行排序。 我想按元組的第一個元素對元組進行排序,所以如果我得到一個類似 [(2,[1]),(1,[]),(3,[2,1])] 的列表,它會返回這個[(1,[]),(2,[1]), (3,[2,1])]。

quickSortTuplas ((x,(ks)) : []) = [(x,(ks))]
quickSortTuplas ((x,(ks)):ps) =   
let smallSort  = quickSort [a | a <- ps, a < x]  
    biggerSort = quickSort [a | a <- ps, a > x]  
in  smallSort ++ [(x,(ks))] ++ biggerSort

如果我嘗試加載它,我會收到以下錯誤:

 Occurs check: cannot construct the infinite type: a ~ (a, [a1])
* In the second argument of `(>)', namely `x'
  In the expression: a > x
  In a stmt of a list comprehension: a > x
* Relevant bindings include
    a :: (a, [a1]) (bound at reNuevoHaskell.hs:60:37)
    biggerSort :: [(a, [a1])] (bound at reNuevoHaskell.hs:60:9)
    ps :: [(a, [a1])] (bound at reNuevoHaskell.hs:58:27)
    ks :: [a1] (bound at reNuevoHaskell.hs:58:22)
    x :: a (bound at reNuevoHaskell.hs:58:19)
    quickSortTuplas :: [(a, [a1])] -> [(a, [a1])]
      (bound at reNuevoHaskell.hs:57:1)

非常感謝您能給我的任何見解。

表達式中的通知[a | a <- ps, a < x] [a | a <- ps, a < x] a是一個元組,而x是一個Int 因此a < x沒有意義。 無論如何,因為您的quicksort適用於Ord a ,您也可以使用它對元組列表進行排序。 試試看`!

quickSort :: Ord a => [a] -> [a]
quickSort [] = []  
quickSort (x:xs) =   
  let smallSort  = quickSort [a | a <- xs, a < x]  
      biggerSort = quickSort [a | a <- xs, a > x]  
   in smallSort ++ [x] ++ biggerSort

main = print $ quickSort [(1,[2,3,4]) , (0, [4,5,6]), (2,[1,2,3])] -- This works fine

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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