如何在Haskell中使用列表推导式实现两个列表的拼接功能
错误原因
你当前的代码存在两个核心问题:
- 运算符
:的作用是将单个元素追加到列表头部,比如1 : [2,3]会得到[1,2,3]。你写的[x : ys | x <- xs]会遍历xs的每一个元素,每次都生成一个新的列表,最终得到的是嵌套列表,比如输入xs = [1,2,3]、ys = [4,5,6]时,原代码的输出是[[1,4,5,6], [2,4,5,6], [3,4,5,6]],类型为[[a]],和你声明的函数返回值类型[a]不匹配。 - 编译器报错中的
cannot construct the infinite type: a ~ [a]就是因为它推断出返回值是嵌套列表,但你的签名要求返回一维列表,试图让元素类型a等于列表类型[a],这显然不可能,因此抛出错误。
修复方案
方案1:基础递归实现(和++底层实现逻辑一致)
combine2 :: [a] -> [a] -> [a] -- 第一个列表为空时直接返回第二个列表 combine2 [] ys = ys -- 第一个列表非空时,将头部元素追加到「剩余部分和第二个列表拼接的结果」头部 combine2 (x:xs) ys = x : combine2 xs ys
方案2:使用foldr一行实现
如果你不想手写递归,可以用折叠函数实现相同逻辑:
combine2 :: [a] -> [a] -> [a] combine2 xs ys = foldr (:) ys xs
内容的提问来源于stack exchange,提问作者milanHrabos
相关产品推荐
相关产品推荐

