【问题标题】:sorting array of tuple in haskell by index按索引对haskell中的元组数组进行排序
【发布时间】:2012-07-16 17:37:46
【问题描述】:

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

     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]  

但它给了我一个错误:

错误第 20 行 - 在列表中键入错误 *** 表达式:[y,xs] *** 期限:xs *** 类型:[a] *** 不匹配:a *** 因为:统一会给出无限类型

*请注意,请只给我指导

--编译器为在线编译器

【问题讨论】:

  • 你到底想做什么?只对列表进行排序,还是对元组进行排序?

标签: sorting haskell


【解决方案1】:

我不知道完整的解决方案,但bubblesort 期望[t],但bubblesort [x,z,xs] 将是[[t]] -&gt; [[t]] 的函数。所以每次,类型都会被另一个[]包裹住​​

另外,你不需要map bubblesort。试着记住 map 函数的确切作用,看看为什么这没有意义。

【讨论】:

  • 很高兴我能提供帮助而无需付出太多:)
  • 我认为这根本不能解决真正的问题。请参阅下面的评论,了解我认为可以解决问题的方法。
【解决方案2】:

您遇到的主要问题是我经常看到初学者遇到的问题。您正在使用列表,因此您决定必须使用方括号。您真正需要的是:

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。

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

【讨论】:

  • 这确实解决了他的部分问题,但您还需要 bubblesort a:[]bubblesort [] 的递归基本案例。
  • @eternalmatt 对,我不想为他们做所有的功课=)
【解决方案3】:

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() 中看到的那样,现在它已修复

【讨论】:

  • 这仅适用于四元素列表,这可能不是您想要的,但它越来越接近。你可能想在 IRC 频道上询问这个问题,这样你就可以与某人来回交流,并让它一步一步地做你想做的事。
  • Freenode 上的#haskell IRC 频道。有关这方面的更多信息(以及其他一些 Haskell 资源),请参阅 stackoverflow.com/tags/haskell/info
猜你喜欢
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 2011-12-17
  • 2022-01-28
  • 2021-11-15
  • 1970-01-01
  • 2015-05-13
  • 2015-08-27
相关资源
最近更新 更多