如何处理返回任一monad的函数

Tan*_*rya 0 monads haskell

我试图在我的代码中加入错误处理.

我正在调用一个函数

generateCSR :: (MonadRandom m, HashAlgorithmConversion hashAlg, HashAlgorithm hashAlg) 
            => X520Attributes -> PKCS9Attributes -> KeyPair -> hashAlg 
            -> m (Either Error CertificationRequest) 
Run Code Online (Sandbox Code Playgroud)

所以我需要在这种情况下处理错误.我以为我可以做这样的事情

case generateCSR (parameters) of
 Right req -> req
 left Error -> putStrLn ("Error : " ++ show Error)
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用.

但如果我做这样的事情

 Right req <- generateCSR (parameters)
 putStrLn.show req 
Run Code Online (Sandbox Code Playgroud)

它给了我一个输出.

如何在此处实现错误处理?我在第一种情况下(case of声明)做了一些完全错误的事情吗?

pat*_*pat 5

不知道如何传递单个parameters,generateCSR因为它需要4个参数,但我会把它归结为伪代码.

generateCSR返回一个Either包裹在一些monand m,它必须是一个实例MonadRandom,其中IO是候选.你不能直接在结果上使用案例; 你必须使用monad的bind来访问Either内部.在第二个例子中,使用绑定与要求的模式EitherRight,这将不能适当地处理它的情况Left.相反,您可以将结果绑定到变量,然后使用case语句来决定要执行的操作:

f = do
    r <- generateCSR parameters
    case r of
        Left err -> ...
        Right req -> ...
Run Code Online (Sandbox Code Playgroud)

请注意,两种情况都必须按照do(bind)的要求返回包含在同一monad中的内容.