File 读取Haskell中的值和列表列表

File 读取Haskell中的值和列表列表,file,haskell,File,Haskell,在将这个问题标记为重复之前,我已经阅读了这个主题:解决方案并不能解决我的问题 我正在尝试读取包含以下结构的文件中的内容: String, String, [(Int, Int, Int)] 该文件如下所示: Name1 22/05/2018 [(1, 5, 10), (2, 5, 5), (3, 10, 40)] Name2 23/05/2018 [(1, 10, 10), (2, 15, 5), (3, 50, 40),(4,20,5)] Name3 22/0

在将这个问题标记为重复之前,我已经阅读了这个主题:解决方案并不能解决我的问题

我正在尝试读取包含以下结构的文件中的内容:

String, String, [(Int, Int, Int)]
该文件如下所示:

Name1   22/05/2018  [(1, 5, 10), (2, 5, 5), (3, 10, 40)]    
Name2   23/05/2018  [(1, 10, 10), (2, 15, 5), (3, 50, 40),(4,20,5)]    
Name3   22/05/2018  [(4, 2, 1), (5, 2, 2), (6, 50, 3), (1,2,3)]    
Name4   23/05/2018  [(1, 3, 10), (2, 1, 5), (3, 2, 40), (6,20,20)]
在Haskell中,我创建了这个函数来读取文件的内容,并将该内容“转换”为我的自定义类型

rlist :: String -> [(Int, Int, Int)]
rlist = read

loadPurchases :: IO [(String, String, [(Int, Int, Int)])]
loadPurchases = do s <- readFile "tes.txt"
                   return (glpurch (map words (lines s)))

glpurch :: [[String]] -> [(String, String, [(Int, Int, Int)])]
glpurch [] = []
gplpurch ([name, dt, c]:r) = (name, dt, (rlist c)) : gplpurch r
rlist::String->[(Int,Int,Int)]
rlist=读取
loadPurchases::IO[(字符串,字符串,[(Int,Int,Int)])]
loadPurchases=dos[(字符串,字符串,[(Int,Int,Int)])]
glpurch[]=[]
gplpurch([name,dt,c]:r)=(name,dt,(rlist c)):gplpurch r
但当我尝试执行“loadPurchases”函数时,会出现以下错误: 函数glpurch中的非穷举模式

使用:set-Wall,我收到了以下帮助消息:

<interactive>:6:1: warning: [-Wincomplete-patterns]
Pattern match(es) are non-exhaustive
In an equation for `glpurch':
    Patterns not matched:
        ([]:_:_)
        ([_]:_)
        ([_, _]:_)
        ((_:_:_:_:_):_)
:6:1:警告:[-Wincomplete模式]
模式匹配是非穷举的
在“glpurch”的方程式中:
不匹配的模式:
([]:_:_)
([_]:_)
([_, _]:_)
((_:_:_:_:_):_)
我的问题是如何创造所有这些条件


如果有人能帮我创造那些可能决定“停止条件”的条件,我将不胜感激。

您只匹配长度为3的列表,而事实上每行上还有很多单词。只需在GHCi中尝试:

> words "Name1   22/05/2018  [(1, 5, 10), (2, 5, 5), (3, 10, 40)]"
["Name1","22/05/2018","[(1,","5,","10),","(2,","5,","5),","(3,","10,","40)]"]
您可能希望重新组合前两个词之后的所有单词:

glpurch ((name : dt : rest) :r) = (name, dt, (rlist $ unwords rest)) : gplpurch r

为了解决我的问题,我按照@Welperooni和@Thomas M.DuBuisson的建议做了

我在函数中添加了以下代码:

glpurch ((name: dt: c: _): r) = (name, dt, (read c :: [(Cod, Quant, Price)

我删除了我文件列表中的空格,这些空格使文本的分割不正确。

你能试着做
((名称:dt:c:uUr)
吗?你的提示几乎奏效了。我这样做了:glpurch((name:dt:c:u):r)=(name,dt,(rlist c)):glpurch r,但现在我得到了这个消息:[(“Name1”,“22/05/2018”,“22/05/2018”,“***例外:Prelude.read:no parseIn GHCi try
words”Name4 23/05/2018[(1,3,10),(2,1,5),(3,2,40),(6,20,20)]”
查看您得到了什么。然后键入
it!!2
查看传递给
rlist
c
的值是多少。请注意,这只是列表的一部分。是的,确实如此。另一种解决方案是删除列表中逗号之间的空格?我删除文件中的所有空格,然后解决非常感谢你们和@Welperooni的建议。