在Haskell中连接2个输入列表

cwxwcias  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(171)

我尝试从输入中合并2个列表,但每次都出错。下面是我的代码:

myAppend :: [a] -> [a] -> [a]
myAppend a b = zipWith (+) a b

获取此错误:“没有因使用'+'而产生的(Num a)的示例”
我得到了这个解决方案,但它对我来说没有任何意义

myAppend :: [a] -> [a] -> [a]
myAppend [] xs = xs
myAppend (y:ys) xs = y:(myAppend ys xs)

第二、第三行我不是很懂。
有人能帮忙吗?
谢谢

cgvd09ve

cgvd09ve1#

你的myAppend并不是连接两个列表,它的目的是对两个列表的元素求和,所以myAppend [1,4,2,5] [1,3,0,2]将产生[2,7,2,7]。它需要一个Num a约束,因为它只在列表的元素是Num bers时才有效:

myAppend :: Num a => [a] -> [a] -> [a]
myAppend a b = zipWith (+) a b

至于这里的解决方案,它使用递归。Haskell中的列表就像链表:你有一个空列表(“nil”),它由[]数据构造函数表示,还有一个节点(“cons”),它由(x:xs)表示,其中x指向第一个元素,xs指向剩余元素的列表,所以[1,4,2,5](1:(4:(2:(5:[]))))的缩写。
如果我们想把[1,4][2,5]添加到列表(1:(4:[]))(2:(5:[]))中,我们就需要生成一个列表(1:(4:(2:(5:[])))),这意味着我们创建了一个链表,其中包含了第一个列表中的所有元素,但是我们让它指向第二个列表中的剩余元素,而不是指向空列表[],我们通过递归来实现这一点:

myAppend (y:ys) xs = y : myAppend ys xs

如果第一个列表与(y:ys)模式一致,则将匹配。在这种情况下,我们将生成一个列表,其中y作为第一个元素,myAppend ys xs的结果作为剩余元素的列表最后我们将调用myAppend ys xs,空列表[]作为第一项。在这种情况下,因此,我们返回第二列表而不是空列表,以将第二列表附加到其上。
因此,我们做出如下调用:

myAppend [1, 4]     [2, 5]
=  myAppend (1:(4:[])) (2:(5:[]))
-> 1 : (myAppend (4:[]) (2:(5:[])))
-> 1 : (4 : (myAppend [] (2:(5:[]))))
-> 1 : (4 : (2:(5:[]))
=  [1, 4, 2, 5]

相关问题