我一直试图读取在haskell中创建数据的文件。我构造了以下数据类型:
data Participant = Participant {name:: String, age:: Int,
country:: String, }
我的文本文件是这种格式
Jack 21 England
Natalie 20 France
Sophie 24 France
每个词分别对应于年龄和国家名称。我想阅读文件并创建参与者列表。但是IO:String似乎是一个脖子痛。您是否有适合这个问题的孤子。
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