[英]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
而不是Nothing
和Just var
,你得到Left error
和Right 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.