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



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

我正在调用一个函数

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声明)?

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

generateCSR返回一个包裹在某个 monandm中的Either,它必须是MonadRandom的实例,IO是其中的候选实例。 您不能直接对结果使用案例;您必须使用 monad 的绑定来访问其中的Either。 在第二个示例中,您使用了 bind 与要求RightEither的模式,这不会优雅地处理它Left的情况。 相反,您可以将结果绑定到变量,然后使用 case 语句来决定要执行的操作:

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

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

最新更新