在 haskell 中编织列表

weaving lists in haskell

例如,我正在尝试创建一个将两个列表编织在一起的函数 [1,3,5][2,4] -> [1,2,3,4,5]

我了解了必须执行和检查的基本原则,但我 运行 遇到了所需类型

的问题
interleave :: ([a],[a]) -> [a] 

给出了关于不同数量参数的错误。这是迄今为止给我的错误最少的版本

interleave ([],[]) = []
interleave (xs,[]) = [xs]
interleave ([],ys) = [ys]
interleave (x:xs) (y:ys) = x : y : interleave xs ys

我试过几次弄乱参数和输出,但我是 haskell 语法的新手,所以我真的不知道哪里出错了

第 2 部分:我还有一个测试文件来确保功能正确,所以如果我在使用该文件后仍然遇到问题(因为我在那里遇到类似的 input/output 不匹配导致我更改为我现在拥有的)我可能 post 那个代码也需要帮助

问题是你的类型签名和你的三个案例都定义了一个参数的函数(([a], [a])类型),但是你的第四个案例试图定义一个两个参数的函数(第一个是x:xs,第二个是y:ys)。

解决方法是将第四种情况更改为也超过一对参数:

interleave (x:xs, y:ys) = x : y : interleave (xs, ys)

除非你要求只接受一个参数,否则我认为将所有情况更改为接受两个参数会更有意义:

interleave [] [] = []
interleave xs [] = xs
interleave [] ys = ys
interleave (x:xs) (y:ys) = x : y : interleave xs ys

请注意,在 interleave xs [] 的情况下,您最初 return 编辑了 [xs]。这是一个包含名为 xs 的列表的列表。相反,您应该直接 return xs。与涉及 ys.

的情况类似