控制 Monad(何时或类似)和非 IO() return 类型

Control Monad (when or the likes) and non IO() return types

我正在尝试在我的程序中使用 "when" 函数,因为我想在某件事为真时执行一个动作,如果不为真则不执行。 我也可以通过使用 Maybe monad 来完成同样的事情,但这会使我的程序的其余部分变得混乱。

问题是当期望 return 类型为 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" 偷偷进入了我最初 posted 的代码,这是我试验过的东西,后来我删除了它。我可以使用 print,但我还需要使用 foreign.marshall 中的 unsafeLocalState,这是不可取的吗?在这种情况下,代码将变得相同,但 当 hasRel (print $ unsafeLocalState (post addr ("dummy" := details)))

我在这里确定了一个解决方案。毕竟,我最终使用了 unsafeLocalState,因为我已经在检查所述值是否存在,最初使用 bool 但最终使用 maybe monad。

编辑:请注意,我不想在这里犯错;两种情况都应打印一些内容用于记录目的。

edit2:更改我的答案以符合 Lee Jan 在这里提到的内容,认为这是一个更好的解决方案。

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