Haskell中的纯错误处理:如何处理错误可能性?

Haskell中的纯错误处理:如何处理错误可能性?,haskell,exception-handling,error-handling,fold,either,Haskell,Exception Handling,Error Handling,Fold,Either,我主要感兴趣的是或者monad以及控件中的所有元素。Error。通过阅读,我确信纯错误应该与IO错误分开。这意味着error、fail、exitFailure都是一些函数,它们的使用应该减少到IO monad。纯计算可以也将产生条件误差,但具有确定性 目前,使用folds,我发现数组中的一个元素可能会生成一个条件错误,从而使整个计算无法满足。例如(使用): 类型CPError=(CPErrorData,字符串) 数据CPErrorData=解析错误字符串|。。。 类型SectionSpec=字符

我主要感兴趣的是
或者
monad以及
控件中的所有元素。Error
。通过阅读,我确信纯错误应该与IO错误分开。这意味着
error
fail
exitFailure
都是一些函数,它们的使用应该减少到IO monad。纯计算可以也将产生条件误差,但具有确定性

目前,使用folds,我发现数组中的一个元素可能会生成一个条件错误,从而使整个计算无法满足。例如(使用):

类型CPError=(CPErrorData,字符串)
数据CPErrorData=解析错误字符串|。。。
类型SectionSpec=字符串
类型选项spec=String
实例错误CPError
实例错误e=>MonadError e(或e)
get::MonadError CPError m=>ConfigParser->SectionSpec->OptionSpec->MA
取消引用::配置解析器->字符串->任一CPError字符串
取消引用cp v=foldr replacer v[“可执行文件”、“参数”、“标题”]
哪里
替换器::字符串->任一CPError字符串->任一CPError字符串
替换字符串acc=do

res我现在明白了,我正在寻找一种方法来折叠可组合操作的列表。我遇到了一个问题,并了解了操作员:

dereferenceValue :: ConfigParser -> String -> Either CPError String
dereferenceValue cp v = do
  foldr (>=>) return (fmap replacer ["executable", "args", "title"]) v
 where
  replacer :: String -> String -> Either CPError String
  replacer string res = do
    value <- get cp "DEFAULT" string
    return $ replace ("${" ++ string ++ "}") value res

结论:学习使用

正如您所发现的,
foldM
在这里非常有效。您的
replacer
功能

replacer :: String -> String -> Either String String
replacer res string = do
  value <- get cp "DEFAULT" string
  return $ replace ("${" ++ string ++ "}") value res
replacer::String->String->任一字符串
replacer res string=do
值字符串->任一字符串
替换字符串=
替换(“${”++string++“}”)获取cp“DEFAULT”字符串纯res
dereferenceValue :: ConfigParser -> String -> Either CPError String
dereferenceValue cp v = do
  foldM replacer v ["executable", "args", "title"]
 where
  replacer :: String -> String -> Either CPError String
  replacer res string = do
    value <- get cp "DEFAULT" string
    return $ replace ("${" ++ string ++ "}") value res
replacer :: String -> String -> Either String String
replacer res string = do
  value <- get cp "DEFAULT" string
  return $ replace ("${" ++ string ++ "}") value res
replacer :: String -> String -> Either String String
replacer res string =
  replace ("${" ++ string ++ "}") <$> get cp "DEFAULT" string <*> pure res