Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何处理返回任意一个单子的函数_Haskell_Monads - Fatal编程技术网

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
包装在某个monand
m
中,它必须是
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
包装在某个monand
m
中,它必须是
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
块的一部分,这隐含地涉及到手边单子的
>=
。而
案例
不使用
>=
或单子。一般来说,这些结构是非常不同的。