= inet_ntoa . fromJust dstaddr >= inet_ntoa . fromJust -- I want to perform actio-6ren">
gpt4 book ai didi

haskell - 如何在Haskell中编写常见的 "if"分支

转载 作者:行者123 更新时间:2023-12-02 15:40:44 27 4
gpt4 key购买 nike

我有以下代码片段:

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)

如何用“nice Haskell”编写这段代码?我正在考虑 MaybeT monad,但不知何故无法使其发挥作用。我试图做一些“提升”,但无法将这些类型缝合在一起。我可以更改 getIfaceAddr/getDestAddr 的签名。

作为旁注:为什么 inet_ntoa 是“HostAddress -> IO String”?我不认为有任何副作用,是吗?

最佳答案

另一个无助的解决方案:

msrcaddr <- getIfaceAddr iface >>= traverse inet_ntoa
mdstaddr <- getDestAddr iface >>= traverse inet_ntoa
case liftM2 (,) msrcaddr mdstaddr of
Just (srcaddr,dstaddr) ->
action1 srcaddr dstaddr
action2 srcaddr dstaddr
action3 srcaddr dstaddr
Nothing -> return ()

如果您愿意,也可以用也许替换外壳。或者,您可以通过直接从该对中进行模式匹配来避免 liftM2。

编辑:这是 Traversable 文档的链接,这是一个被忽视但经常不可或缺的类型类:http://haskell.org/ghc/docs/6.12.2/html/libraries/base-4.2.0.1/Data-Traversable.html

关于haskell - 如何在Haskell中编写常见的 "if"分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4296887/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com