我尝试从输入中合并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)
第二、第三行我不是很懂。
有人能帮忙吗?
谢谢
1条答案
按热度按时间cgvd09ve1#
你的
myAppend
并不是连接两个列表,它的目的是对两个列表的元素求和,所以myAppend [1,4,2,5] [1,3,0,2]
将产生[2,7,2,7]
。它需要一个Num a
约束,因为它只在列表的元素是Num
bers时才有效:至于这里的解决方案,它使用递归。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:[]))))
,这意味着我们创建了一个链表,其中包含了第一个列表中的所有元素,但是我们让它指向第二个列表中的剩余元素,而不是指向空列表[]
,我们通过递归来实现这一点:如果第一个列表与
(y:ys)
模式一致,则将匹配。在这种情况下,我们将生成一个列表,其中y
作为第一个元素,myAppend ys xs
的结果作为剩余元素的列表最后我们将调用myAppend ys xs
,空列表[]
作为第一项。在这种情况下,因此,我们返回第二列表而不是空列表,以将第二列表附加到其上。因此,我们做出如下调用: