Отладка функции чтения Haskell - PullRequest
2 голосов
/ 16 ноября 2010

Я новичок в Haskell и пишу простую систему принятия решений ИИ, чтобы играть в игру с 20 вопросами. Если программа не может угадать правильный ответ, она задаст вопрос, который будет использоваться для различения ответа, и сохранит этот вопрос в дереве. Он читает дерево из файловой системы в начале программы и записывает его обратно в конце.

У меня много проблем с кодом сериализации в Haskell. Я получаю сообщение об ошибке «Прелюдия прочитана: нет разбора». В чем дело? Вот мой код:

import Data.Char
import System.IO

-- Defines a type for a binary tree that holds the questions and answers
data Tree a = 
        Answer String | 
        Question String (Tree a) (Tree a)
        deriving (Read, Show)

-- Starts the game running
main = do
        let filePath = "data.txt"
        fileContents <- readFile filePath
        animals <- return (read fileContents)
        putStrLn "Think of an animal. Hit Enter when you are ready.  "
        _ <- getLine
        ask animals
        writeFile filePath (show animals)

-- Walks through the animals tree and ask the question at each node
ask :: Tree a -> IO ()
ask (Question q yes no) = do
        putStrLn q
        answer <- getLine
        if answer == "yes" then ask yes
                           else ask no
ask (Answer a) = do
        putStrLn $ "I know! Is your animal a " ++ a ++ "?"
        answer <- getLine
        if answer == "yes" then computerWins
                           else playerWins

computerWins = do putStrLn "See? Humans should work, computers should think!"

playerWins = do putStrLn "TODO"

А вот файл данных, который я использую:

Question "Does it live in the water?"
        ((Question "Does it hop?") (Answer "frog") (Answer "fish"))
        (Answer "cow")

1 Ответ

4 голосов
/ 16 ноября 2010

read не предназначен для надежной обработки таких вещей, как лишние скобки. Ваш код работает для меня со следующим файлом данных:

Question "Does it live in the water?"
        (Question "Does it hop?" (Answer "frog") (Answer "fish"))
        (Answer "cow")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...