【问题标题】:How to deal with functions returning a either monad如何处理返回任一单子的函数
【发布时间】:2019-02-16 00:52:29
【问题描述】:

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

我正在调用一个函数

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 语句)我做错了什么吗?

【问题讨论】:

  • 你想用 Right 值做什么?在这种情况下,您似乎必须将类型合并为一个类型,例如:f :: Either Error CertificationRequest -&gt; IO () 等。
  • 所以我写的函数应该要么返回证书请求要么返回错误,
  • 第二个 sn-p 是 do 块的一部分,它隐含地涉及手头单子的 &gt;&gt;=case 不使用 &gt;&gt;= 或 monads。一般来说,这些结构非常不同。

标签: haskell monads


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多