У меня есть следующий фрагмент кода:Как написать общий «если» ветвление в Haskell
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)
Как написать этот код в «хороший Haskell»? Я думал о монаде MaybeT, но почему-то не смог заставить ее работать. Я пытался сделать некоторые «подъемы», но не смог сшить типы вместе. Я могу изменить подпись getIfaceAddr/getDestAddr.
В качестве побочного элемента: почему inet_ntoa «HostAddress -> IO String»? Я не думаю, что есть какие-то побочные эффекты, не так ли?
Yep - Я могу передать результат getIfaceAddr на вспомогательную функцию и сделать там inet_ntoa. Я просто немного устал от ответа «Создать помощник» на все. – ondra 2010-11-28 13:33:58
К счастью, вы можете использовать функцию `liftM2` для монашки` Maybe` из `Control.Monad` вместо того, чтобы кататься самостоятельно. – nponeccop 2011-11-29 16:31:35