gpt4 book ai didi

Haskell:使用 IO() 值过滤字典/散列/映射

转载 作者:行者123 更新时间:2023-12-02 10:56:49 25 4
gpt4 key购买 nike

我有一个函数,其签名是 String -> String -> IO (也许是 String)现在,我使用此函数为字典构建值,最终得到: [(String,IO (Maybe String))]

我必须分析字典中的值并根据结果返回适当的键。我希望只使用 map 上的过滤器来单步执行它,但我想不出一种方法来动态提取 IO 操作。那么,如何映射/过滤运行 IO 操作的字典,并根据 IO 操作值的结果返回字典的适当键?有没有简单的方法可以做到这一点,或者我只是让自己陷入困境?

谢谢。

最佳答案

也许解决方案是将 sequence 与类似的东西一起使用

sequence . map (\(a,mb) -> (mb >>= \b -> return (a,b)))

然后您可以简单地使用 liftM 将过滤器应用于生成的 IO [(String,Maybe String)]

liftM 位于 Control.Monad 中。或者,用 do 表示法

myFilter :: (String,(Maybe String)) -> Bool) 
-> [(String,IO (Maybe String))]
-> IO [(String,(Maybe String))]
myFilter f ml =
do
l <- sequence . map (\(a,mb) -> (mb >>= \b -> return (a,b))) $ ml
return $ filter f ml

也许需要进行一些重构。通常,在使用 monad 时,您希望使用 mapM 而不是 map

Control.Monad 中还有一个 filterM 函数。这可能正是您所需要的。

<小时/>

编辑:评论中指出

sequence . map (\(a,mb) -> (mb >>= \b -> return (a,b))) $ ml

相当于

mapM (\(a,mb) -> fmap ((,) a) mb) ml

所以

myFiter' f = (liftM $ filter f) .  mapM (\(a,mb) -> fmap ((,) a) mb)

关于Haskell:使用 IO() 值过滤字典/散列/映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9255521/

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