为什么这个 IO 处理不起作用 (IO (Either ab))

1 haskell

我试图从 IO 类型的表达式(要么 ab)中提取“a”和错误“b”。

我有这个函数,它根据文件路径返回一个解析的文件

readFile' :: FilePath -> IO (Either a b)
Run Code Online (Sandbox Code Playgroud)

这就是我尝试提取 a 和 b 值的方法:

rFile :: FilePath -> String
rFile f = do
            l <- readFile' f
            case l of 
               Right n -> show n
               Left m  -> show m
Run Code Online (Sandbox Code Playgroud)

这是错误消息:

Couldn't match type `IO' with `[]'
  Expected type: [Either a b]
    Actual type: IO (Either a b)
* In a stmt of a 'do' block: l <- readFile' f
Run Code Online (Sandbox Code Playgroud)

che*_*ner 5

rFile不能返回String值,只能返回IO String值。(或者更准确地说, do 构造的结果必须是一个IO String值,而不是一个String。)

rFile :: FilePath -> IO String
rFile f = do
            l <- readFile' f
            return $ case l of 
               Right n -> show n
               Left m  -> show m
Run Code Online (Sandbox Code Playgroud)

您可以使用fmapandeither来摆脱显式案例分析和 do 语法。

rFile f = fmap (either show show) (readFile' f)
Run Code Online (Sandbox Code Playgroud)

(明显的后续问题,我如何String从 an获得 a IO String,是我不打算在这里重复的问题。出于所有实际意图和目的,你不需要。)