Контроль Monad (когда или лайки) и не IO() возвращаемых типов
Я пытаюсь использовать функцию "когда" в моей программе, потому что я хочу, чтобы действие было выполнено заранее, если что-то верно, а не если оно не верно. Я мог бы также сделать то же самое, используя монаду "Возможно", но это загромождает остальную часть моей программы.
Проблема в том, что, когда ожидается, что возвращаемый тип будет IO(), но я хочу, чтобы он (или моя собственная версия) работал для IO(Response ByteString)
Это мой код функции:
mayNotifyDs :: Bool -> String -> ByteString -> IO (Response ByteString)
mayNotifyDs hasRel specName details =
when hasRel (post addr ("dummy" := details))
where addr = "http://127.0.0.1:8082/dummydir/" ++ specName
редактирование: "печать" проникла в код, который я первоначально разместил, это было кое-чем, с чем я экспериментировал, и с тех пор я удалил это. Я могу использовать print, но тогда мне нужно также использовать unsafeLocalState из foreign.marshall, и это не рекомендуется, не так ли? В этом случае код станет таким же, но с помощью метода hasRel (print $ unsafeLocalState (post addr ("dummy":= details)))
1 ответ
Я остановился на решении здесь. В конце концов я использовал unsafeLocalState после того, как все увидел, поскольку я уже проверяю, существует ли указанное значение, первоначально с помощью bool, но в конечном итоге с возможно монадой.
редактировать: пожалуйста, обратите внимание, что я не хочу приводить здесь ошибку; оба случая должны напечатать что-то для целей регистрации.
edit2: изменение моего ответа в соответствии с тем, что Ли Ян упомянул здесь, считая его лучшим решением.
mayNotifyDs :: String -> Maybe ByteString -> IO ()
mayNotifyDs specName details = case details of
(Just _) -> post addr ("dummy" := details) >>= print
Nothing -> putStrLn "Message about fail"
where addr = "http://127.0.0.1:8082/dummydir/" ++ specName