“读取”字符串数据到haskell“数据”类型

时间:2011-05-22 02:22:58

标签: haskell types

感谢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)

没有实例

3 个答案:

答案 0 :(得分:11)

首先,您需要为您的类型派生Read

你可以认为readshow是对立的,是一种穷人的序列化。 show允许您从String转换为readString转换,并且在大多数情况下,生成的String也应该是有效的Haskell代码,在编译时,产生read给你的相同值。

在这方面,文件的内容不起作用,因为这不是readshow的默认实现所使用的格式,即通过放置{获得的实现{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