"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" в выводящее утверждение, которое автоматически создаст что-то разумное для этого