2

I write a code to sort index of tuple list I try to use map with bubblesort() to avoid using loops

     bubblesort::(Ord t) => [t]->[t]
     bubblesort[x,y,z,xs]=
                if x<y then x : map bubblesort [y,z,xs]
                       else y : map bubblesort [x,z,xs]  

but it give me an error that :

ERROR line 20 - Type error in list
*** Expression     : [y,xs]
*** Term           : xs
*** Type           : [a]
*** Does not match : a
*** Because        : unification would give infinite type

*note please give me instruction only

--The complier is online compiler

4

3 回答 3

2

我不知道对此的完整解决方案,但bubblesort 期望[t],但bubblesort [x,z,xs]将是[[t]] -> [[t]]. 所以每次,类型都会被另一个类型包裹起来[]

此外,您不需要这样做map bubblesort。试着记住这个map函数到底做了什么,看看为什么这没有意义。

于 2012-07-16T17:45:42.757 回答
1

您遇到的主要问题是我看到初学者一直在做的一个问题。您正在使用列表,因此您决定必须使用方括号。你真正需要的是这样的:

bubblesort (x:y:xs) = 
    if x < y 
       then x : bubblesort (y:xs)
       else y : bubblesort (x:xs)

当你使用类似的东西时

foo [a,b,c] = …

您在一个恰好包含三个元素的列表上进行显式模式匹配。如果你使用

foo (a:b:c:xs) = …

那么你在一个至少有三个元素的列表上显式匹配,其中第一个绑定到名称 a,第二个 b,第三个 c,并且列表的其余部分(不管它有多长)称为 xs .

我希望这有助于清除它。这是一个非常常见的错误。

于 2012-07-18T12:18:44.807 回答
-1

Thanx alote etemalmatt 这是我自己的问题的奴隶

  bubbleSort::(Ord t) => [t]->[t]
  bubbleSort[x,y,z,xs]=
                if x<y then x : [y,z,xs]
                       else y : [x,z,xs]
   superBubble::(Ord t) => [[t]]->[[t]]
   superBubble a=map bubbleSort a

我的问题是使用map递归应用于所有元素的函数,所以我的解决方案是让它与一个元素一起工作,正如你bubbleSort()现在看到的那样,它已修复

于 2012-07-16T19:58:15.580 回答