「如果」分支我有下面的代碼片段:如何寫常見於哈斯克爾
srcaddr <- getIfaceAddr iface >>= inet_ntoa . fromJust
dstaddr <- getDestAddr iface >>= inet_ntoa . fromJust
-- I want to perform actions only if neither getIfaceAddr
-- nor getDestAddr returned Nothing
action1 srcaddr dstaddr
action2 srcaddr dstaddr
action3 srcaddr dstaddr
getIfaceAddr :: String -> IO (Maybe HostAddress)
getDestAddr :: String -> IO (Maybe HostAddress)
如何寫「好哈斯克爾」這個代碼?我正在考慮MaybeT monad,但不知何故無法實現。我試圖做一些「提升」,但無法將這些類型拼湊在一起。我可以更改getIfaceAddr/getDestAddr的簽名。
作爲旁註:爲什麼inet_ntoa'HostAddress - > IO String'?我不認爲有任何副作用,是嗎?
是的 - 我可以將getIfaceAddr的結果傳遞給輔助函數,並在那裏執行inet_ntoa。對於所有內容,我只是對「創建幫助函數」的答案感到有些厭倦。 – ondra 2010-11-28 13:33:58
幸運的是,您可以使用`liftM2`函數來控制``Maybe` monad`從Control.Monad`,而不是自己滾動。 – nponeccop 2011-11-29 16:31:35