List 使用气泡排序对列表中的列表按长度排序-Haskell

List 使用气泡排序对列表中的列表按长度排序-Haskell,list,sorting,haskell,multidimensional-array,functional-programming,List,Sorting,Haskell,Multidimensional Array,Functional Programming,我有一个输入,类型为[[a]],我正在尝试按列表的长度对列表进行排序。我正在开发自己的冒泡排序实现,目前看起来如下: myInput :: Ord a => [[a]] -> [[a]] myInput [[]] = [[]] myInput [[x]] = [[x]] myInput (x : xs) = mySort x (myInput xs) mySort :: Ord a => [a] -> [[a]] -> [[a]] mySort x [[]] =

我有一个输入,类型为
[[a]]
,我正在尝试按列表的长度对列表进行排序。我正在开发自己的冒泡排序实现,目前看起来如下:

myInput :: Ord a => [[a]] -> [[a]]
myInput [[]] = [[]]
myInput [[x]] = [[x]]
myInput (x : xs) = mySort x (myInput xs)

mySort :: Ord a => [a] -> [[a]] -> [[a]]
mySort x [[]] = [x]
mySort x (y:ys) | (length x) < (length y) = x:y:ys
                | otherwise = y:(myInput x ys)

当声明空列表时,我可能做错了什么,因为这是一个递归错误(如果我错了,请纠正我)。关于如何使其工作的任何提示?谢谢

myInput
没有空列表的模式,只有一个元素为空列表的列表。您可能不需要像
[[]]
[[x]]]
这样的模式,因为对于包含单个元素的列表,您将返回包含该元素的列表,而不管其长度如何,因此:

myInput :: Ord a => [[a]] -> [[a]]
myInput [] = []
myInput [x] = [x]
myInput (x : xs) = mySort x (myInput xs)
myInput::Ord a=>[[a]]->[[a]]
myInput[]=[]
myInput[x]=[x]
myInput(x:xs)=mySort x(myInput xs)

[[x]]
与只包含一个子列表的列表匹配,该列表是一个包含一个元素的列表。因此,这将与
[[1]]
匹配,但与
[[1,2]]
不匹配<另一方面,code>[x]与任何单例列表都匹配:一个列表有一个元素,所以
[[1]]
[[1,4]]
[[1,4,2,5]]
都将匹配。

myInput
没有空列表模式,只有一个元素的列表是空列表。非常感谢您的提示!我是否只需通过
myInput[]=[[]]
来更正它?我把它添加到我的代码中,但仍然得到相同的详尽模式错误no
myInput[]=[]
myInput[x]=[x]
。什么是
myInsert
?如果仅按长度排序,则
Ord a
约束是多余的。您应该打开
-Wall
,这样编译器将为您提供有关丢失的模式的详细警告(以及其他有用的警告)。如果您只需要模式警告,请使用
-Wincomplete patterns-Wincomplete uni patterns
@dfeuer,是的,谢谢您提醒我,
Ord
在那里,因为我在上一个作业中也使用了相同的函数对列表中的元素进行排序,因此关于这个
-Wall
,我是否只输入带有此标志的函数?例如
myInput[[1,2],[1]]-Wall
?谢谢非常感谢,我还需要将
mySort x[[]]=[x]
更改为
mySort x[]=[x]
,现在它工作得非常好。我明白我现在做错了什么,真的被双括号弄糊涂了。谢谢!
myInput :: Ord a => [[a]] -> [[a]]
myInput [] = []
myInput [x] = [x]
myInput (x : xs) = mySort x (myInput xs)