Я пытаюсь прочитать из файла два списка собственного типа данных «BoardEdge». Когда я пытаюсь запустить код, я получаю исключение:
"Main.hs: Prelude.read: no parse"
Как я подозреваю, я получаю это от функции, отвечающей за проверку ввода (validateInput). Когда я пытаюсь использовать эту функцию в ghci, вставляя два объекта BoardEdge, она работает хорошо и выдает True.
Может ли кто-нибудь дать мне совет, что я делаю неправильно и как я могу решить проблему?
Типы данных:
data Field = Empty | Black | Yellow deriving (Eq, Ord, Enum, Show, Read)
data BoardEdge = BoardEdge { colRow :: [[(Field, Int)]]} deriving (Read, Eq, Ord, Show)
Main.hs
main :: IO()
main = do
args <- getArgs
input <- loadInput args
putStrLn "Puzzle input loaded:"
putStrLn input
let parsedInput = parseInput input
if (validateInput parsedInput)
then putStrLn "Input is valid."
else error "Input invalid!"
-- asks for path and reads input file
loadInput :: [String] -> IO String
loadInput [] = getPath >>= readFile where
getPath = do
putStrLn "Provide path to puzzle input file:"
getLine
loadDefinition (a:_) = readFile a
-- get valid data from input file
parseInput :: String -> (B.BoardEdge,B.BoardEdge)
parseInput d = parseInput' $ lines d where
parseInput' (columns: rows :_) =
(read columns, read rows)
Функция проверки в импортированных Board.hs квалифицируется как B:
validateInput :: (B.BoardEdge,B.BoardEdge) -> Bool
validateInput (columns, rows) = rowColEq where
rowColEq = countBlocks columns == countBlocks rows
-- function that counts total quantity of colored blocks
countBlocks :: (B.BoardEdge)-> Int
countBlocks (B.BoardEdge colRow) = countBlocks' $ concat colRow where
countBlocks' [] = 0
countBlocks' (x:xs) = snd x + countBlocks' xs
И мои входные файлы выглядят так:
[[(Black,2),(Yellow,2),(Black,1)],[(Black,2),(Yellow,1),(Black,3)]]
[[(Black,5)],[(Black,2),(Black,1)],[(Black,2),(Black,2)],[(Black,1),(Black,2)]]