感谢this excellent tutorial,我知道如何读取字符串(在这种情况下,从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)
答案 0 :(得分:11)
首先,您需要为您的类型派生Read
。
你可以认为read
和show
是对立的,是一种穷人的序列化。 show
允许您从String
转换为read
,String
转换,并且在大多数情况下,生成的String
也应该是有效的Haskell代码,在编译时,产生read
给你的相同值。
在这方面,文件的内容不起作用,因为这不是read
和show
的默认实现所使用的格式,即通过放置{获得的实现{1}}和Read
条款中的Show
。
例如,鉴于此:
deriving
然后在GHCi中,我们得到:
data Person = Person String String Int Float String String deriving (Read, Show)
buddy = Person "Buddy" "Finklestein" 43 184.2 "526-2928" "Chocolate"
引号被转义,因为它是> show buddy
"Person \"Buddy\" \"Finklestein\" 43 184.2 \"526-2928\" \"Chocolate\""
值。在文件中,它看起来像这样:
String
您将注意到与源文件中的原始定义相同。
答案 1 :(得分:7)
只需将Read
添加到派生
data Person = Person String String Int Float String String deriving (Show, Read)
答案 2 :(得分:1)
“Read”是一个类型类,这意味着有一个函数read :: String -> Person
是有意义的。您可以在派生语句中添加“read”,这将自动生成对read
函数有意义的内容。请注意,它实际上需要在各个字段(“Buddy”等)之前放置“Person”。
或者,您可以定义自己的读取功能:
instance Read Person where
read str = undefined -- add your definition here