我目前正在使用Haskell进行项目开发,遇到了一些问题。我需要读取并将“dictionary.txt”文件中的每一行插入到一个列表中,但似乎无法实现。这是我的代码:
main = do
let list = []
loadNums "dictionary.txt" list
loadNums location list = do
inh <- openFile location ReadMode
mainloop inh list
hClose inh
mainloop inh list = do
ineof <- hIsEOF inh
if ineof
then return ()
else do
inpStr <- hGetLine inh
inpStr:list
mainloop inh list
它应该获取每一行(我知道它确实获取了每一行,因为将“inpStr:list”替换为“putStrLn inpStr”可以正确地显示所有行),并将其插入到列表中,但我收到以下错误:
Couldn't match expected type `IO' against inferred type `[]'
可能是因为hGetLine不是String类型,而是IO String类型,我不知道如何处理才能得到一个适当的字符串,以便将其插入到我的列表中。我不知道这个问题怎么解决,或者具体是什么问题,但如果有人知道如何将文件中的每一行正确地放入列表中,我会非常感激。
提前感谢!
readFile
。使用readFile
、getContents
和interact
等函数来处理文件读取/行读取/EOF检测/文件关闭等混乱情况,有助于摆脱命令式思维方式。 - NefrubyrmapM_
和mapM
完全相同,只是它忽略了结果。因此,你只需要在单子中使用()
而不是获取单子结果的列表。由于putStrLn
无论如何都会提供IO ()
,因此使用mapM
将得到IO [()]
;而mapM_
则将其转换为实际所需的IO ()
。 - Tikhon JelvisgetLines :: String -> IO [String]
是可以的。 - ephemient