假设我有一个1 = Cash
2 = Money Transfer
3 = Visa
4 = etc
函数,我想让它应用于每行文件并得到一系列结果。我怎么能这样做?
parseMessage
答案 0 :(得分:5)
首先,您必须认识到parseFile
必须在IO monad中运行,因为它涉及文件I / O.这意味着从readFile
生成的IO操作中提取内容,然后将结果打包回IO操作。这里首先分两步,将纯计算与IO操作分开:
parseContents :: String -> [SpecificDataStructure]
parseContents contents = map parseMessage (lines contents)
parseFile :: String -> IO [SpecificDataStructure]
parseFile fileName = readFile fileName >>= return . parseContents
在这里它被写为一个函数
parseFile :: String -> IO [SpecificDataStructure]
parseFile fileName = do
contents <- readFile fileName
let parsed = map parseMessage (lines contents)
return parsed
答案 1 :(得分:0)
你可能希望做这样的事情:
public String acd;
parseFile = do
f <- readFile "myfile.txt"
map myFunc $ lines f
将文件拆分为lines
列表,String
允许您将一个函数(在第一个参数中提供)应用于列表的每个元素。结果是一个值列表。 (GHCi中的map
收益:t map
)。
答案 2 :(得分:0)
首先,使用readFile
获取文件的内容contents <- readFile "filename"
然后,使用适当命名的函数
将文件拆分为行let fileLines = lines contents
最后,将每一行转换为您的结构
let objects = map parseMessage fileLines
这将是表示原始文件的结构数组。