我正在尝试在我的程序中使用"when"函数,因为我想在某事为真时预制一个动作,如果某事不真实,则不然。我也可以通过使用 May monad 来完成同样的事情,但这会使我的程序的其余部分变得混乱。
问题是当期望返回类型为 IO(( 但我想让它(或我自己的版本(适用于 IO(响应字节字符串(
这是我到目前为止的函数代码:
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
编辑:一个"打印"潜入我最初发布的代码中,这是我尝试过的东西,后来我删除了它。我可以使用打印,但我还需要使用来自 foreign.marsshall 的 unsafeLocalState,这是不可取的,是吗?在这种情况下,代码将变得相同,但当 hasRel (print $ unsafeLocalState (post addr ("dummy" := details(((
我在这里确定了一个解决方案。毕竟,我最终使用了 unsafeLocalState,因为我已经在检查所述值是否存在,最初使用 bool,但最终使用 may 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