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)
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,是我不打算在这里重复的问题。出于所有实际意图和目的,你不需要。)