IO (Either a b)类型的IO处理代码为何无法运行?
解决Haskell中IO (Either a b)的类型匹配问题
咱们先拆解一下你遇到的错误:
错误根源:类型不匹配
你定义的rFile返回类型是String,但里面用了do块处理readFile' f——这是个IO (Either a b)类型的操作。Haskell看到你的返回类型是String(本质是[] Char),会默认把do块当成List Monad来处理,但readFile'属于IO Monad,所以就出现了Couldn't match type 'IO' with '[]'的错误。
简单说:纯函数(返回String)里不能直接执行IO操作,IO操作必须包裹在IO类型的上下文里。
修正后的代码
把rFile的返回类型改成IO String,让整个函数处于IO上下文里,do块就能正确识别为IO Monad了:
rFile :: FilePath -> IO String rFile f = do l <- readFile' f case l of Right n -> return $ show n Left m -> return $ show m
这里还要注意:show n和show m返回的是纯String值,但在IO do块里需要用return把纯值包装成IO String类型,才能符合函数的返回类型要求。
额外说明
如果你想从IO (Either a b)里提取结果,必须在IO上下文内处理——Haskell的设计就是要严格区分纯代码和有副作用的IO代码,不能直接把IO操作的结果“拉”到纯函数里使用。如果后续需要对这个结果做纯逻辑处理,可以先在IO里拿到Either a b值,再把纯函数应用到它上面。
内容的提问来源于stack exchange,提问作者eak223223
相关产品推荐
相关产品推荐

