简短而且甜蜜,我有一个看起来像这样的文本文件:
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}
但我似乎无法正确理解语法......
答案 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"