将字符串数据读入haskell数据类型?

时间:2014-08-25 02:07:55

标签: haskell

简短而且甜蜜,我有一个看起来像这样的文本文件:

ID1|ID2|DATE|SUM
0|0|20/03/2014|100.00
0|1|20/04/2014|99.00

我有一个如下所示的自定义数据类型:

data DBData = DBData { id1   :: Int
                     , id2   :: Int
                     , date  :: String
                     , sum   :: Int
                     } deriving (Eq, Read, Show)

我如何将其纳入其中?

到目前为止,我一直在玩弄的是使用这样的东西:

parseRow :: [String] -> DBData 
parseRow = let (id1:id2:date:sum) = (splitWhen (=='|')) s
                i = read id1
             in DBData {id1 = i}

但我似乎无法正确理解语法......

与我的其他帖子有关: https://stackoverflow.com/questions/25477554/using-splitwhen-to-split-string-by-delimiter-and-trying-to-figure-out-how-to-sto

1 个答案:

答案 0 :(得分:4)

在Haskell中,所有数据构造函数和具体类型必须以大写字母开头:

data DbData = DbData ...

此外,如果您想使用read方法以自定义格式读取内容,则必须将数据类型设为Read的实例:

instance Read DbData where
  read s = ...

在实例定义中,您可以像定义任何其他Haskell函数一样定义read

此外,正确的let语法(在do块之外)是

let binding = val
in
... body ...

创建数据类型时,您(通常)会创建一个或多个构造函数,您可以使用这些构造函数来创建该类型的值。这是一个类似于你的例子

data Example = Example { a :: Int
                       , b :: Char
                       , c :: String
                       }

我们可以使用Example构造函数创建Example类型的值(请注意,这些 需要具有相同的名称):

exampleValue :: Example
example = Example 1 'z' "abcdef"