我正在尝试将错误处理纳入我的代码中。
我正在调用函数
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
语句)中做错了什么吗?
答案 0 :(得分:5)
由于需要4个参数,因此不确定如何将单个parameters
传递给generateCSR
,但是我将其归为伪代码。
generateCSR
返回以某种monand Either
包装的m
,它必须是MonadRandom
的实例,其中IO
是候选对象。您不能直接在结果上使用案例。您必须使用monad的绑定访问其中的Either
。在第二个示例中,您使用的绑定模式要求Either
为Right
,这将无法很好地处理Left
的情况。相反,您可以将结果绑定到变量,然后使用case语句来决定要做什么:
f = do
r <- generateCSR parameters
case r of
Left err -> ...
Right req -> ...
请注意,根据do
(绑定)的要求,这两种情况还必须返回包装在同一个monad中的内容。