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

时间:2018-01-19 08:49:39

标签: haskell io-monad wreq

我正在尝试使用"当"在我的程序中运行,因为我希望在某些事情是真的时执行一个动作,而不是如果它不是真的。 我也可以通过使用Maybe monad完成同样的事情,但这会使我的程序的其余部分混乱。

问题是当期望返回类型为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

编辑: A"打印"偷偷摸摸我最初发布的代码,这是我尝试过的东西,我已经删除了它。我可以使用print但是我还需要使用来自foreign.marshall的unsafeLocalState,这是不可取的吗?在这种情况下,代码将变得相同,但是 当hasRel(print $ unsafeLocalState(post addr(" dummy":= details)))

1 个答案:

答案 0 :(得分:0)

我在这里找到了一个解决方案。我最终看到了unsafeLocalState,因为我已经检查了所述值是否存在,最初是bool但最终是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