【发布时间】:2017-10-15 17:30:31
【问题描述】:
我在 Haskell 中读取关卡文件时遇到问题。目标是读取一个简单的 txt 文件,其中两个数字用空格隔开,然后是逗号。我一直遇到的问题是:无法匹配类型`IO' with `[]'
如果我理解正确,do 语句应该将字符串从 Monad 中拉出。
readLevelFile :: FilePath -> [FallingRegion]
readLevelFile f = do
fileContent <- readFile f
(map lineToFallingRegion (lines fileContent))
lineToFallingRegion :: String -> FallingRegion
lineToFallingRegion s = map textShapeToFallingShape (splitOn' (==',') s)
textShapeToFallingShape :: String -> FallingShape
textShapeToFallingShape s = FallingShape (read $ head numbers) (read $ head
$ tail numbers)
where numbers = splitOn' (==' ') s
【问题讨论】:
-
“如果我理解正确, do 语句应该将字符串从 Monad 中拉出。”不完全的。你之前在 Haskell 中做过 IO 吗?
-
不,这是我第一次处理 IO 和 Monads。我一直在研究learnyouahaskell.com 的示例。我已经通读了这本书。
-
非常粗略地说,
do x <- action ; ...确实将x拉出 IOaction,但仅如果后续的...仍在 IO 内部工作,那么最终返回类型为IO something形式。没有办法只“删除 IO”——这是因为,按照设计,我们希望IO出现在任何执行 IO 的函数的返回类型中。这就是重点!您可以阅读monads in picutres 了解更多示例。