我有一个可以从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作为参数 …
我使用以下场景作为示例来学习如何以简单的方式处理错误.该场景基本上是从环境变量读取文件路径,然后使用文件路径读取和打印文件.
下面的代码有效,但我不喜欢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)