Как работать с функциями, возвращающими любую монаду - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь включить обработку ошибок в мой код.

Я вызываю функцию

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

1 Ответ

0 голосов
/ 15 февраля 2019

Не уверен, как вы можете передать один parameters в generateCSR, так как он требует 4 аргумента, но я записываю его в псевдокод.

generateCSR возвращает Either, завернутый внекоторый монанд m, который должен быть экземпляром MonadRandom, из которых IO является кандидатом.Вы не можете напрямую использовать регистр для результата;Вы должны использовать привязку монады, чтобы получить доступ к Either внутри.Во втором примере вы использовали связывание с шаблоном, который требует, чтобы Either был Right, что не будет корректно обрабатывать случай, когда это Left.Вместо этого вы можете привязать результат к переменной, а затем использовать оператор case, чтобы решить, что делать:

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

Обратите внимание, что оба случая также должны будут возвращать что-то, заключенное в одну и ту же монаду, как того требуетdo (связать).

...