我编写了一个代码来对元组列表的索引进行排序我尝试将 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
*请注意,请仅给我说明
- 编译器是在线编译器
答案 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()
中所见的一个元素一起使用现在它已修复