Читайте значения и список списков в Haskell - PullRequest
0 голосов
/ 07 июня 2018

Прежде чем пометить этот вопрос как дублированный, я уже прочитал эту тему: Haskell прочитал целое число и список списков из файла , и решение не решило мою проблему.

I 'Я пытаюсь прочитать содержимое в файле, который содержит эту структуру:

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

Но когда я пытаюсь выполнить функцию «loadPurchases», я получаю эту ошибку: неисчерпывающие шаблоны в функции glpurch.

Используя: set -Wall, я получил это справочное сообщение:

<interactive>:6:1: warning: [-Wincomplete-patterns]
Pattern match(es) are non-exhaustive
In an equation for `glpurch':
    Patterns not matched:
        ([]:_:_)
        ([_]:_)
        ([_, _]:_)
        ((_:_:_:_:_):_)

Моя проблема заключается в том, как создать все эти условия.

Я буду очень признателен, если кто-нибудь сможет помочьсоздать те условия, которые могут определить «условие остановки»

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Чтобы решить мою проблему, я сделал то, что предложили @Welperooni и @Thomas M. DuBuisson.

Я добавил этот код в свою функцию:

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

И удалил пробелы, которыебыли в списке в моем файле, эти пробелы сделали разделение текста не сделано правильно.

0 голосов
/ 07 июня 2018

Вы соответствуете спискам длиной 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...