繁体   English   中英

Haskell:处理类型和异常

[英]Haskell: Dealing With Types And Exceptions

我想知道捕获和处理异常的“Haskell方式”。 如下所示,我理解基本语法,但我不知道在这种情况下如何处理类型系统。

以下代码尝试返回所请求的环境变量的值。 显然,如果那个变量不存在,我想捕获异常并返回Nothing。

getEnvVar x = do {
    var <- getEnv x;
    Just var;
} `catch` \ex -> do {
    Nothing
}

这是错误:

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 }

我可以返回字符串值:

getEnvVar x = do {
    var <- getEnv x;
    return var;
} `catch` \ex -> do {
    ""
}

然而,这并不像Haskell那样。 什么是Haskell方式?

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

您无法剥离IO并在do-block中返回Maybe String 您需要返回IO (Maybe String)

getEnvVar x = do {
    var <- getEnv x;
    return (Just var);
} `catch` \ex -> do {
    return Nothing
}

为什么不用

import qualified System.IO.Error as E
getEnvVar :: String -> IO (Either IOError String)
getEnvVar = E.try . getEnv

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

一旦你得到任何涉及getEnv的事情将涉及在IO monad中返回结果,那么你的基本方法没有任何问题。 虽然你可以使用System.IO.Error (我愿意),但是按照你的方式编写它是同样有效和有益的。 但是,你确实使用了比Haskell使用的更多标点符号:

getEnvVar x = (Just `fmap` getEnv x) `catch` const (return Nothing)

要么

getEnvVar x = getEnv x `catch` const (return "")

你也可以试试

import System.Environment
getEnvVar :: String -> IO (Maybe String)
getEnvVar x = getEnvironment >>= return . lookup x

或者更长一点,但也许更容易遵循:

getEnvVar x = do
    fullEnvironment <- getEnvironment
    return (lookup x fullEnvironment)

如果你不介意整个环境经历整个环境。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM