感谢这个优秀的教程,我知道如何读取一个字符串(在这种情况下,从一个文件people.txt
直接读取到一个类型的同义词:
type Person = [Int]
Run Code Online (Sandbox Code Playgroud)
像这样:
people_text <- readFile "people.txt"
let people :: [Person]
people = read people_text
Run Code Online (Sandbox Code Playgroud)
我想要做的是使用数据类型(而不是类型同义词).
关于我在这里缺少什么的指示?我以为我能够直接读取字符串数据Person
- 这样定义(信用到learnyouahaskell.com)
data Person = Person String String Int Float String String deriving (Show)
Run Code Online (Sandbox Code Playgroud)
当我尝试显而易见的时候
txt <- readFile "t.txt" (this works OK)
Run Code Online (Sandbox Code Playgroud)
用t.txt
含
"Buddy" "Finklestein" 43 184.2 "526-2928" "Chocolate"
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
没有实例
(Read Person)
C. *_*ann 12
首先,您需要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"
Run Code Online (Sandbox Code Playgroud)
然后在GHCi中,我们得到:
> show buddy
"Person \"Buddy\" \"Finklestein\" 43 184.2 \"526-2928\" \"Chocolate\""
Run Code Online (Sandbox Code Playgroud)
引号被转义,因为这是一个String
值.在文件中,它看起来像这样:
Person "Buddy" "Finklestein" 43 184.2 "526-2928" "Chocolate"
Run Code Online (Sandbox Code Playgroud)
您将注意到它与源文件中的原始定义相同.
只需添加Read
到派生
data Person = Person String String Int Float String String deriving (Show, Read)
Run Code Online (Sandbox Code Playgroud)