"读取"字符串数据到haskell"数据"类型

use*_*127 10 haskell types

感谢这个优秀的教程,我知道如何读取一个字符串(在这种情况下,从一个文件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为您的类型派生.

你可以想到readshow作为对立面,以及一种穷人的序列化.show允许您转换String,read转换String,并且在大多数情况下,String生成的也应该是有效的Haskell代码,在编译时,它会生成相同的值read.

关于这一点,你的文件的内容是行不通的,因为这不是由默认的实现使用的格式readshow,即您通过将得到实现ReadShowderiving条款.

例如,鉴于此:

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)

您将注意到它与源文件中的原始定义相同.


Aar*_*aid 7

只需添加Read到派生

 data Person = Person String String Int Float String String deriving (Show, Read)
Run Code Online (Sandbox Code Playgroud)

  • 投票行为很奇怪,但可以预测.你的回答是第一个,简单的,正确的,所以得到了早期的支持(包括我).几分钟后我回答,约30分钟后,它被接受了.可能的选民倾向于在最初的5-10分钟内遇到很多问题,然后是缓慢的问题直到接受答案,之后问题大多被忽略.对于像这样的简单问题,快速和正确得到更多的赞成而不是详细. (2认同)