【问题标题】:QuickSort applied to a list of tuples (Int,[Int]) in Haskell快速排序应用于 Haskell 中的元组列表 (Int,[Int])
【发布时间】:2021-05-19 10:17:46
【问题描述】:

下午好,

我是 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)

非常感谢您能给我提供的任何见解。

【问题讨论】:

  • 我知道 Quicksort 应该在其中一个绑定中使用“=”,但我不需要存储重复项。
  • 感谢 Ismor 的回答,我使用的元组类似于 [(1,[]),(2,[1]), (3,[2,1]),.. .]。我想按第一个元素对它们进行排序,即 Int on (Int, [Int]),而不注意第二个元素,但是当我尝试加载上面的代码时出现错误。
  • 你的 quickSort 实现应该与 [(Int,[Int])] 一起使用,因为 if 也实现了 Ord
  • 如果在第一个元素中绘制呢? (0,[1,2])(0,[0,1]) 会更大
  • 这个函数将是一个更大的程序的一部分,一个不同的函数负责处理这种情况(在这两个元组中(0,[1,2]),(0,[0, 1]) 将被合并为一个元组 (0,[0,1,2])。它不应该接收一个不在列表中的元组,在这种情况下,它只会被删除而不是添加,如果它确实如此程序可以启动异常,因为这意味着输入没有正确写入。

标签: haskell declarative-programming


【解决方案1】:

注意表达式[a | a &lt;- ps, a &lt; x] a 是一个元组,而 x 是一个 Int。因此a &lt; x 毫无意义。在任何情况下,因为您的 quicksortOrd 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

【讨论】:

  • 天哪。我想我还有很长的路要走类型签名。非常非常感谢我的朋友,你让我的头疼不已。
  • 确实你是完全正确的。整个程序现在按预期工作。再次,非常感谢!
猜你喜欢
  • 2022-11-17
  • 2011-05-12
  • 1970-01-01
  • 2012-11-29
  • 2017-07-13
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多