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 = ...
    
    但这仍然是错误的。我基本上可以想到两个应用程序

    “合并”两个列表 如果要合并列表