按索引排序haskell中的元组数组

时间:2012-07-16 17:37:46

标签: sorting haskell

我编写了一个代码来对元组列表的索引进行排序我尝试将 map bubblesort()一起使用 避免使用循环

     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]  

但它给我一个错误:

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

*请注意,请仅给我说明

- 编译器是在线编译器

3 个答案:

答案 0 :(得分:2)

我不知道完整的解决方案,但bubblesort期望[t],但bubblesort [x,z,xs]将是[[t]] -> [[t]]的函数。因此,每次,类型都会被另一个[]

包围

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

答案 1 :(得分: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。

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

答案 2 :(得分:-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()中所见的一个元素一起使用现在它已修复