读取文件并在haskell中创建数据

问题描述 投票:-1回答:2

我一直试图读取在haskell中创建数据的文件。我构造了以下数据类型:

data Participant = Participant {name:: String, age:: Int,
                                country:: String, }

我的文本文件是这种格式

Jack 21 England
Natalie 20 France
Sophie 24 France

每个词分别对应于年龄和国家名称。我想阅读文件并创建参与者列表。但是IO:String似乎是一个脖子痛。您是否有适合这个问题的孤子。

list file haskell io readfile
2个回答
0
投票

IO隔离不是缺陷,而是Haskell的功能,也是其明显的成功之一。

如果要序列化数据到文件,并将数据加载回程序中,则不必手动执行。使用任何序列化库,其中有很多。您还可以使用强大的Aeson库,该库可以将数据转换为JSON并将其加载回。

如果出于任何原因要手动执行此操作,则必须首先定义自己的文件格式,并且要明确。例如,如果名称包含空格,您的示例会怎样?

然后,您应该定义一个函数,该函数可以解析文件格式的一行并产生一个参与者readParticipant :: String -> Maybe Participant。请注意可能的原因,因为如果字符串格式错误,则您的函数将无法从其帽子中创建参与者,因此它将产生Nothing

然后,您可以具有解析参与者列表(注意复数)readParticipants :: String -> [Participants]的功能。这里可能没有,因为列表本身允许失败。

现在您可以拥有一个微型IO功能,它将读取文件内容,并在其上运行readParticipants

readParticipantsIO :: IO [Participants]
readParticipantsIO = readParticipants <$> readFile "participants.data"

-- alternative definition, exact same behaviour in this case

readParticipantsIO :: IO [Participants]
readParticipantsIO = do
  content <- readFile "participants.data"
  return $ readParticipants content


0
投票

lineslines函数可用于将字符串拆分为字符串列表,然后可以将这些字符串打包为words列表。

words
© www.soinside.com 2019 - 2024. All rights reserved.