在 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
.
的情况类似
例如,我正在尝试创建一个将两个列表编织在一起的函数
[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
.