如何处理返回一个Monad的函数

时间:2019-02-15 16:09:45

标签: haskell monads

我正在尝试将错误处理纳入我的代码中。

我正在调用函数

generateCSR :: (MonadRandom m, HashAlgorithmConversion hashAlg, HashAlgorithm hashAlg) 
            => X520Attributes -> PKCS9Attributes -> KeyPair -> hashAlg 
            -> m (Either Error CertificationRequest) 

因此,在这种情况下,我需要处理错误。我以为我可以做这样的事情

case generateCSR (parameters) of
 Right req -> req
 left Error -> putStrLn ("Error : " ++ show Error)

但这似乎不起作用。

但是如果我做这样的事情

 Right req <- generateCSR (parameters)
 putStrLn.show req 

它给了我一个输出。

如何在这里实现错误处理?我在第一种情况(case of语句)中做错了什么吗?

1 个答案:

答案 0 :(得分:5)

由于需要4个参数,因此不确定如何将单个parameters传递给generateCSR,但是我将其归为伪代码。

generateCSR返回以某种monand Either包装的m,它必须是MonadRandom的实例,其中IO是候选对象。您不能直接在结果上使用案例。您必须使用monad的绑定访问其中的Either。在第二个示例中,您使用的绑定模式要求EitherRight,这将无法很好地处理Left的情况。相反,您可以将结果绑定到变量,然后使用case语句来决定要做什么:

f = do
    r <- generateCSR parameters
    case r of
        Left err -> ...
        Right req -> ...

请注意,根据do(绑定)的要求,这两种情况还必须返回包装在同一个monad中的内容。