"read" - ing string data в типы haskell" данные"

спасибо этот отличный учебник, Я знаю, как читать строку (в этом случае читать из файла в people.txt непосредственно в синоним типа:

type Person = [Int]

такой:

people_text <- readFile "people.txt"
let people :: [Person]
    people = read people_text

то, что я хочу сделать, это использовать тип данных (вместо синонима типа).

любые указатели на то, что мне здесь не хватает? Я думал, что смогу читать строковые данные непосредственно в Person - определенными, как это (кредит learnyouahaskell.com)

data Person = Person String String Int Float String String deriving (Show)

когда я пытаюсь очевидное

 txt <- readFile "t.txt" (this works OK)

С t.txt содержащих

"Buddy" "Finklestein" 43 184.2 "526-2928" "Chocolate"

Я получаю эту ошибку:

нет экземпляра для (Read Person)

3 ответов


прежде всего, вам нужно вывести Read для вашего типа.

вы можете думать о read и show как противоположности и своего рода сериализация бедняка. show позволяет конвертировать к String, read преобразует из String, и в большинстве случаев String произведенный также должен быть действительным кодом Haskell, который при компиляции производит то же значение, что read дает вам.

на этой ноте, содержание файла не будет работать, потому что это не формат, используемый реализациями по умолчанию read и show, т. е. реализации, которые вы получаете, помещая Read и Show на deriving предложения.

например, так:

data Person = Person String String Int Float String String deriving (Read, Show)

buddy = Person "Buddy" "Finklestein" 43 184.2 "526-2928" "Chocolate"

затем в GHCi мы получаем:

> show buddy
"Person \"Buddy\" \"Finklestein\" 43 184.2 \"526-2928\" \"Chocolate\""

кавычки экранируются, потому что это String значение. В файле, это будет выглядеть так:

Person "Buddy" "Finklestein" 43 184.2 "526-2928" "Chocolate"

который вы заметите, совпадает с исходным определением в источнике файл.


просто добавить Read для определения

 data Person = Person String String Int Float String String deriving (Show, Read)

"Read" - это typeclass, что означает, что имеет смысл иметь функцию read :: String -> Person. Вы можете добавить "read" в выводящее утверждение, которое автоматически создаст что-то разумное для этого