Haskell 如何处理返回任意一个单子的函数
我试图在我的代码中加入错误处理 我正在调用一个函数Haskell 如何处理返回任意一个单子的函数,haskell,monads,Haskell,Monads,我试图在我的代码中加入错误处理 我正在调用一个函数 generateCSR :: (MonadRandom m, HashAlgorithmConversion hashAlg, HashAlgorithm hashAlg) => X520Attributes -> PKCS9Attributes -> KeyPair -> hashAlg -> m (Either Error CertificationReque
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 generateCSR (parameters) of
Right req -> req
left Error -> putStrLn ("Error : " ++ show Error)
Right req <- generateCSR (parameters)
putStrLn.show req
Right-req不确定如何将单个参数
传递给generateCSR
,因为它需要4个参数,但我将其记为伪代码
generateCSR
返回一个or
包装在某个monandm
中,它必须是MonadRandom
的一个实例,其中IO
是一个候选实例。不能直接对结果使用案例;您必须使用monad的bind来访问中的或。在第二个示例中,您使用了绑定模式,该模式要求或为右
,这将不能很好地处理左
的情况。相反,您可以将结果绑定到一个变量,然后使用case语句来决定要执行的操作:
f = do
r <- generateCSR parameters
case r of
Left err -> ...
Right req -> ...
f=do
R
右请求->。。。
请注意,这两种情况都必须返回包装在同一个monad中的内容,这是do
(bind)所要求的。不确定如何将单个参数
传递给generateCSR
,因为它需要4个参数,但我将其记为伪代码
generateCSR
返回一个or
包装在某个monandm
中,它必须是MonadRandom
的一个实例,其中IO
是一个候选实例。不能直接对结果使用案例;您必须使用monad的bind来访问中的或。在第二个示例中,您使用了绑定模式,该模式要求或为右
,这将不能很好地处理左
的情况。相反,您可以将结果绑定到一个变量,然后使用case语句来决定要执行的操作:
f = do
r <- generateCSR parameters
case r of
Left err -> ...
Right req -> ...
f=do
R
右请求->。。。
请注意,这两种情况都必须按照do
(bind)的要求返回包装在同一个monad中的内容。要如何处理正确的值?在这种情况下,您似乎必须将类型聚合为一个类型,类似于:f::Error CertificationRequest->IO()
或诸如此类。因此,我正在编写的函数应该返回证书请求或错误,第二个代码段是do
块的一部分,这隐含地涉及到手边单子的>=
。而案例
不使用>=
或单子。一般来说,这些构造是非常不同的。您希望如何使用正确的值?在这种情况下,您似乎必须将类型聚合为一个类型,类似于:f::Error CertificationRequest->IO()
或诸如此类。因此,我正在编写的函数应该返回证书请求或错误,第二个代码段是do
块的一部分,这隐含地涉及到手边单子的>=
。而案例
不使用>=
或单子。一般来说,这些结构是非常不同的。