Blu*_*ger 2 haskell types exception
我想知道捕获和处理异常的"Haskell方式".如下所示,我理解基本语法,但我不知道在这种情况下如何处理类型系统.
以下代码尝试返回所请求的环境变量的值.显然,如果那个变量不存在,我想捕获异常并返回Nothing.
getEnvVar x = do {
var <- getEnv x;
Just var;
} `catch` \ex -> do {
Nothing
}
Run Code Online (Sandbox Code Playgroud)
这是错误:
Couldn't match expected type `IO a'
against inferred type `Maybe String'
In the expression: Just var
In the first argument of `catch', namely
`do { var <- getEnv x;
Just var }'
In the expression:
do { var <- getEnv x;
Just var }
`catch`
\ ex -> do { Nothing }
Run Code Online (Sandbox Code Playgroud)
我可以返回字符串值:
getEnvVar x = do {
var <- getEnv x;
return var;
} `catch` \ex -> do {
""
}
Run Code Online (Sandbox Code Playgroud)
然而,这并不像Haskell那样.什么是Haskell方式?
编辑:更新代码以正确反映描述.
你不能剥离IO并Maybe String在do-block中返回.你需要退货IO (Maybe String).
getEnvVar x = do {
var <- getEnv x;
return (Just var);
} `catch` \ex -> do {
return Nothing
}
Run Code Online (Sandbox Code Playgroud)
为什么不用
import qualified System.IO.Error as E
getEnvVar :: String -> IO (Either IOError String)
getEnvVar = E.try . getEnv
Run Code Online (Sandbox Code Playgroud)
而不是Nothing和Just var,你得到Left error和Right var.