相关疑难解决方法(0)

Haskell中的Either和Except在用法上有什么区别?

我有一个可以从Haskell中的几个参数创建的类,该类需要对这些参数进行一些复杂的验证。目前我有类似

makeAThingExcept :: String -> String -> ... String -> Except ThingError AThing
makeAThingExcept s1 s2 ... = do
    unless (s1CheckPasses s1) (throwError (BadS1 s1))
    ...

data ThingError = BadS1 String ...

instance Show ThingError where
        show (BadS1 s) = "Bad S1: " ++ s

makeAThing :: String -> String -> ... String -> AThing
makeAThing s1 s2 ... = case runExcept (makeAThingExcept s1 s2 ...) of
        Right thing  -> thing
        Left err -> error (show err)
Run Code Online (Sandbox Code Playgroud)

撇开是否有更好的方法,通过使用更具体的类型,而不是做这个String作为参数 …

error-handling haskell user-input exception-handling

5
推荐指数
2
解决办法
289
查看次数

如何简化错误处理(IO(任一ab))

我使用以下场景作为示例来学习如何以简单的方式处理错误.该场景基本上是从环境变量读取文件路径,然后使用文件路径读取和打印文件.

下面的代码有效,但我不喜欢printFile它,因为它有嵌套case of,有点难读.我想知道是否有一种干净的方法来摆脱它并保持printFile功能平坦而不使用lookupEnv

您将如何简化此错误处理流程?

module Main where

import Control.Exception (IOException, handle, throw)
import System.Environment (getEnv)
import System.IO.Error (isDoesNotExistError)

data MissingError
  = MissingEnv String
  | MissingFile String
  deriving (Show)

main :: IO ()
main = do
  eitherFile <- printFile
  either print print eitherFile

getEnv' :: String -> MissingError -> IO (Either MissingError String)
getEnv' env err = handle (missingEnv err) $ Right <$> (getEnv env)

readFile' :: FilePath -> MissingError -> IO (Either …
Run Code Online (Sandbox Code Playgroud)

haskell

4
推荐指数
2
解决办法
317
查看次数