我试图了解如何在Haskell中使用zip。我最近一直在学习Haskell,并试图从两个单独的列表中创建一个元组列表。
我有以下内容:
createList :: [Char] -> [Char] -> [(Char,Char)]
createList xs ys = zip(xs,ys)
我知道zip应该创建给定两个列表的元组列表,但是出现以下错误:
Couldn't match expected type ‘[a0]’
with actual type ‘([Char], [Char])’
有人可以告诉我我在哪里绊脚石吗?
答案 0 :(得分:6)
Haskell函数调用不使用方括号或逗号。
您可以将ScoreList
函数编写为:
createList
或者简单地
createList xs ys = zip xs ys
因此,createList = zip
函数是多余的;只是createList
。我能想到的别名的唯一潜在用途是,如果您确实想约束给定的类型。
答案 1 :(得分:4)
如果您删除zip
调用前后的括号,则您的代码应该可以正常工作
createList :: [Char] -> [Char] -> [(Char,Char)]
createList xs ys = zip xs ys
运行zip ([1, 2, 3], [4, 5, 6])
时出现完整错误(请注意括号):
<interactive>:4:5:
Couldn't match expected type ‘[a]’
with actual type ‘([Integer], [Integer])’
Relevant bindings include
it :: [b] -> [(a, b)] (bound at <interactive>:4:1)
In the first argument of ‘zip’, namely ‘([1, 2, 3], [4, 5, 6])’
In the expression: zip ([1, 2, 3], [4, 5, 6])
In an equation for ‘it’: it = zip ([1, 2, 3], [4, 5, 6])
请注意In the first argument of ‘zip’, namely ‘([1, 2, 3], [4, 5, 6])’
部分。括号被解释为tuple constructor。 zip
函数期望将列表作为其第一个参数,但我们正在将其传递给元组。