Контроль 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
Другие вопросы по тегам