【问题标题】:Control Monad (when or the likes) and non IO() return types控制 Monad (when 等) 和非 IO() 返回类型
【发布时间】:2018-01-19 08:49:38
【问题描述】:

我正在尝试在我的程序中使用“何时”功能,因为我希望在某事为真时执行一个动作,如果不是真的则不执行。 我也可以通过使用 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

编辑: 我最初发布的代码中潜入了“打印”,这是我尝试过的东西,后来我将其删除。我可以使用 print,但我还需要使用 foreign.marshall 中的 unsafeLocalState,这是不可取的吗?在这种情况下,代码将变得相同,但具有 when hasRel (print $ unsafeLocalState (post addr ("dummy" := details)))

【问题讨论】:

  • 那么,如果条件不满足,你希望结果是什么?如果使用if…then…else 编写,您的代码会是什么样子?
  • print 返回(),所以它应该适合。 Response ByteString 应该从哪里来?
  • 听起来你想要返回类型为Maybe (IO (Response ByteString)),类似于if hasRel then Just (post addr ...) else Nothing

标签: haskell io-monad wreq


【解决方案1】:

我在这里找到了一个解决方案。我最终还是使用了 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

【讨论】:

  • 这里为什么需要unsafeLocalState?你不想要(Just _) -> post addr ("dummy" := details) >>= print吗?
  • 是的,unsafeLocalState(或unsafePerformIO)在这里是不必要且不可取的。只需使用绑定:do { result <- post addr ("dummy" := details); print result }>>=/=<< Lee 提到的。
  • 是的,我不敢相信我没看到。谢谢。
猜你喜欢
  • 2013-05-09
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多