首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用readFile

如何使用readFile
EN

Stack Overflow用户
提问于 2017-10-16 01:30:32
回答 2查看 919关注 0票数 1

我在读取Haskell中的级别文件时遇到了问题。目标是读入一个简单的txt文件,其中两个数字由空格分隔,然后是逗号。我一直得到的问题是:无法匹配类型`IO' with `[]'

如果我理解正确的话,do语句应该是从Monad中拉出字符串。

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2017-10-16 02:11:16

你不能把东西从IO中拉出来。您可以将IO想象成一个容器(实际上,对IO的一些解释将其比作装有Schrödinger的猫的盒子)。您看不到容器中有什么,但是如果您步入容器,值就会变得可见。

因此,这应该是可行的:

代码语言:javascript
复制
readLevelFile f = do
    fileContent <-  readFile f
    return (map lineToFallingRegion (lines fileContent))

但是,它不具有操作中给出的类型。在do块中,fileContent是一个String值,但整个块仍然在IO容器中。

这意味着函数的返回类型不是[FallingRegion],而是IO [FallingRegion]。因此,如果您将readLevelFile的类型注释更改为

代码语言:javascript
复制
readLevelFile :: FilePath -> IO [FallingRegion]

你应该能够跨过第一个障碍。

票数 2
EN

Stack Overflow用户

发布于 2017-10-16 02:11:00

让我们来看看你的第一个显式类型的函数:

代码语言:javascript
复制
readLevelFile f = do
    (fileContent :: String) <-
                  (readFile :: String -> IO String) (f :: String) :: IO String

fileContent确实是String类型,但仅在我们正在评估的IO Monad的执行中可用。这次又是什么?

代码语言:javascript
复制
    (map lineToFallingRegion (lines fileContent))  :: [String]

现在,您突然使用了一个表达式,它不是IO monad,而是一个列表值--因为列表也是monad的一种类型,所以类型检查试图将IO[]统一起来。你真正想要的是返回这个值:

代码语言:javascript
复制
return (map lineToFallingRegion (lines fileContent)) :: IO [String]

现在回想一下,我们永远不能“退出”IO monad你的readLevelFile类型必须是IO -诚实地承认它与外部世界交互:

代码语言:javascript
复制
readLevelFile :: FilePath -> IO [FallingRegion]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46757938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档