List 非常简单的haskell程序,但我仍然无法找到错误
大家好,这是我写的一个非常简单的代码,我认为它应该做什么很清楚,但它就是不起作用,我似乎找不到一种方法来修复它。 我很感激得到的每一个帮助,但请更正程序,因为现在我不想找到另一种方法来编写相同的程序,而是要找到我已经创建的错误List 非常简单的haskell程序,但我仍然无法找到错误,list,haskell,List,Haskell,大家好,这是我写的一个非常简单的代码,我认为它应该做什么很清楚,但它就是不起作用,我似乎找不到一种方法来修复它。 我很感激得到的每一个帮助,但请更正程序,因为现在我不想找到另一种方法来编写相同的程序,而是要找到我已经创建的错误 提前感谢将[x:xs]更改为(x:xs),和[y:ys]也一样 此外,您不能将列表前置到列表;可以将元素前置到列表中。因此,将[x,y]:更改为x:y: 您也不想为案例2和案例3创建嵌套列表,因此将[xs]更改为仅xs,将[ys]更改为[x:xs],将[x:xs]更改为(
提前感谢将
[x:xs]
更改为(x:xs)
,和[y:ys]
也一样
此外,您不能将列表前置到列表;可以将元素前置到列表中。因此,将[x,y]:
更改为x:y:
您也不想为案例2和案例3创建嵌套列表,因此将
[xs]
更改为仅xs
,将[ys]
更改为[x:xs]
,将[x:xs]
更改为(x:xs)
,并将[y:ys]
更改为
此外,您不能将列表前置到列表;可以将元素前置到列表中。因此,将[x,y]:
更改为x:y:
您也不想为案例2和案例3创建嵌套列表,因此将[xs]
更改为仅xs
,对于[ys]
也一样,让我解释一下这段代码:
andX :: [a] -> [a] -> [a]
andX [] [] = []
andX [xs] [] = [xs]
andX [] [ys] = [ys]
andX [x:xs] [y:ys] = [x,y] : andX [xs] [ys]
例如,查看您的答案,您希望:
andX :: [a] -> [a] -> [a]
andX [] [] = []
andX xs [] = xs
andX [] ys = ys
andX (x:xs) (y:ys) = x : y : andX xs ys
或
看看你的尝试(距离足够近)
在这里,前三种情况是可以的,但是要小心[xs]
和[ys]
是只有一个元素的列表,因此如果列表的大小不同,您将遇到模式匹配失败
andX :: [a] -> [a] -> [a]
andX [] [] = []
andX [xs] [] = [xs]
andX [] [ys] = [ys]
这里是最好的问题,首先是:这是一个列表列表,在进行模式匹配时必须使用()
。
然后,[x,y]:andX[xs][ys]
是错误的,同样,类型不匹配,您试图将[a]
添加到[a]
中,您只需添加a
元素,您可以像x:y:andX[xs][ys]
一样执行操作,如果您阅读的是“添加元素x,添加元素y,然后将列表的其余部分添加到和x[xs ys]
“让我解释一下这段代码:
andX :: [a] -> [a] -> [a]
andX [] [] = []
andX [xs] [] = [xs]
andX [] [ys] = [ys]
andX [x:xs] [y:ys] = [x,y] : andX [xs] [ys]
例如,查看您的答案,您希望:
andX :: [a] -> [a] -> [a]
andX [] [] = []
andX xs [] = xs
andX [] ys = ys
andX (x:xs) (y:ys) = x : y : andX xs ys
或
看看你的尝试(距离足够近)
在这里,前三种情况是可以的,但是要小心[xs]
和[ys]
是只有一个元素的列表,因此如果列表的大小不同,您将遇到模式匹配失败
andX :: [a] -> [a] -> [a]
andX [] [] = []
andX [xs] [] = [xs]
andX [] [ys] = [ys]
这里是最好的问题,首先是:这是一个列表列表,在进行模式匹配时必须使用()
。
然后,[x,y]:andX[xs][ys]
是错误的,同样,类型不匹配,您试图将[a]
添加到[a]
中,您只需添加a
元素,您可以像x:y:andX[xs][ys]
一样执行操作,如果您阅读的是“添加元素x,添加元素y,然后将列表的其余部分添加到和x[xs ys]
“这里有一些问题,但最重要的可能是列表语法错误
有两种类型的列表构造函数:
空列表[]
;及
cons(x:xs)
(注意圆括号)
因此,您的第一个子句是正确的:您匹配两个空列表
第二个和第三个在语法上是正确的,但这意味着您要匹配一个单例列表:一个包含一个项目的列表。这是因为Haskell有语法糖:[x]
是(x:[])
的缩写。我很确定你不想匹配单身者名单,但任何名单。如果你想这样做,你可以简单地写:
andX [x:xs] [y:ys] = [x,y] : andX [xs] [ys]
但现在还有其他问题,我们将在后面讨论
最后一个子句是两个参数都使用cons的示例。因此,你应该这样写:
andX xs [] = ...
andX [] ys = ...
但这仍然是错误的。我基本上可以想到两个应用程序
“合并”两个列表
如果您希望在我们获得表单列表的意义上合并列表:
andX :: [a] -> [a] -> [a]
andX [] [] = []
andX xs [] = xs
andX [] ys = ys
andX (x:xs) (y:ys) = [x,y] : andX xs ys
那么我们就不能把归纳情况写成:
[x1,y1,x2,y2,x3,...]
因为这里是返回,所以我们将[x,y]
作为输出的第一个元素。然而,我们可以这样写:
andX (x:xs) (y:ys) = [x,y] : andX xs ys
现在,我们将两个项x
和y
作为单独的项发出,然后是递归调用。在这种情况下,代码片段是:
andX (x:xs) (y:ys) = x : y : andX xs ys
示例:
andX :: [a] -> [a] -> [a]
andX [] [] = []
andX xs [] = xs
andX [] ys = ys
andX (x:xs) (y:ys) = x : y : andX xs ys
andX :: [a] -> [a] -> [[a]]
andX [] [] = []
andX (x:xs) [] = [x] : andX xs []
andX [] (y:ys) = [y] : andX [] ys
andX (x:xs) (y:ys) = [x,y] : andX xs ys
构造子列表
根据您的代码,您希望返回列表列表。但是您的输出类型是[a]
。如果要返回列表列表,它应该是[[a]]
Prelude> andX [1,4,2,5] [1,3,0,2,5]
[1,1,4,3,2,0,5,2,5]
现在我们有了列表列表,每个子列表包含第一个列表中的一个元素,第二个列表中的一个元素。然而,问题是第二和第三个子句使用xs
和ys
作为输出。我们不能这样做,因为我们需要一份清单。我们可以将其改写为:
andX :: [a] -> [a] -> [[a]]
andX [] [] = []
andX xs [] = xs
andX [] ys = ys
andX (x:xs) (y:ys) = [x,y] : andX xs ys
示例:
andX :: [a] -> [a] -> [a]
andX [] [] = []
andX xs [] = xs
andX [] ys = ys
andX (x:xs) (y:ys) = x : y : andX xs ys
andX :: [a] -> [a] -> [[a]]
andX [] [] = []
andX (x:xs) [] = [x] : andX xs []
andX [] (y:ys) = [y] : andX [] ys
andX (x:xs) (y:ys) = [x,y] : andX xs ys
这里有一些问题,但最重要的可能是列表语法错误
有两种类型的列表构造函数:
空列表[]
;及
cons(x:xs)
(注意圆括号)
因此,您的第一个子句是正确的:您匹配两个空列表
第二个和第三个在语法上是正确的,但这意味着您要匹配一个单例列表:一个包含一个项目的列表。这是因为Haskell有语法糖:[x]
是(x:[])
的缩写。我很确定你不想匹配单身者名单,但任何名单。如果你想这样做,你可以简单地写:
andX [x:xs] [y:ys] = [x,y] : andX [xs] [ys]
但现在还有其他问题,我们将在后面讨论
最后一个子句是两个参数都使用cons的示例。因此,你应该这样写:
andX xs [] = ...
andX [] ys = ...
但这仍然是错误的。我基本上可以想到两个应用程序
“合并”两个列表
如果要合并列表