将字符串(从文件)转换为元组

时间:2016-03-01 19:05:21

标签: haskell

我试图将两个文本文件转换为字符串,然后在列表中以双元组的形式将它们一起添加。像这样:[(_,_),(_,_)] 这是我的功能:

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

为什么它将元组与空字符串组合在一起?为什么会出现错误消息?

1 个答案:

答案 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 _      _      = []

这样你也不会偶然错过任何一种模式。