我试图将两个文本文件转换为字符串,然后在列表中以双元组的形式将它们一起添加。像这样:[(_,_),(_,_)]
这是我的功能:
testa = do
questions <- readFile "questionsQ.txt"
category <- readFile "category.txt"
print (myZip category (lines questions))
myZip :: [a] -> [b] -> [(a, b)]
myZip [] [] = []
myZip _ [] = []
myZip (x:xs) (y:ys) = [(x,y)] ++ myZip xs ys
questions.txt
每行包含一个问题
categories.txt
在一个长行中包含一行50个数字,每个数字代表5个类别中的一个
(注意 - 它可能适用于Mac电脑,但我不知道为什么) 这是我尝试运行程序时的错误消息(至少有一些):
[("0","I prefer variety to routine"),("0",""),("0","I'm an innovative person with a vivid imagination"),("0",""),("0","I enjoy wild flights of fantasy")....
ghci>
*** Exception: todo.hs:(35,1)-(37,44): Non-exhaustive patterns in function myZip
为什么它将元组与空字符串组合在一起?为什么会出现错误消息?
答案 0 :(得分:4)
异常!怎么会这样?
这不是一个很好的讽刺
但是,有一条信息,告诉你们,
非详尽的模式
在这件事情上
在myZip
中找到了。
您错过了以下案例的模式:
myZip [] [1] = ???
如果您使用过-Wall
,编译器会发出以下警告:
Code.hs:2:1: Warning: Pattern match(es) are non-exhaustive In an equation for `myZip': Patterns not matched: [] (_ : _)
如果你的函数几乎所有模式都返回相同的值,除了一个之外,通常更容易定义那个,然后匹配所有其他模式:
myZip (x:xs) (y:ys) = [(x,y)] ++ myZip xs ys
myZip _ _ = []
这样你也不会偶然错过任何一种模式。