Haskell:处理类型和异常

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方式?

编辑:更新代码以正确反映描述.

ken*_*ytm 7

你不能剥离IOMaybe 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)

而不是NothingJust var,你得到Left errorRight var.