gpt4 book ai didi

Haskell:如何处理另一个 IO monad 中的 IO monad?

转载 作者:行者123 更新时间:2023-12-03 13:29:53 24 4
gpt4 key购买 nike

刚开始学习haskell - 一周后喜欢它。目前正在经历 monads 的痛苦,还没有,但希望它会点击。

我正在尝试组合一个类似于 python walk() 但更简单的函数。
给定一个路径,我想生成元组列表。每个子目录的元组(假设只有目录)。元组将包含目录的路径作为其第一个元素和目录包含的文件列表作为第二个元素。

我不知道我的解释是否正确,但这是代码:

walkDir :: String -> IO [IO (FilePath, [FilePath])]
walkDir path = do
dir <- getDirectoryContents path
let nd = [x | x <- dir, notElem x [".",".."]]
return (map getcont nd)
where
getcont path = do
cont <- getDirectoryContents path
return (path,cont)

我关心的是IO里面的IO,怎么处理??是否可以取消它们?
是否可以至少解开内部 IO?这样的返回正常吗?

我什至不能打印这种返回。我是否必须创建一个 show 实例才能正确打印?

在某些 haskell 库中很可能存在类似的功能,但这是出于教育目的。我想学习。所以欢迎提出任何建议。

非常感谢你。

最佳答案

让我们来看看类型。

map :: (a -> b) -> [a] -> [b]
getCont :: FilePath -> IO (FilePath, [FilePath])
nd :: [FilePath]

map getCont nd :: [IO (FilePath, FilePath)]

现在,在这一点上,结构看起来是由内而外的。我们有 [IO a] 但我们想要 IO [a] 。停止!胡闹时间。概括任何 ol' monad,我们 hoogle [m a] -> m [a] 。瞧, sequence 具有精确的类型签名。因此,您应该使用 return :: a -> m a 而不是 sequence :: [m a] -> m [a] ,如下所示:
sequence (map getCont nd)

然后你就准备好了。请注意,这与 Kurt S 的解决方案基本相同,因为
mapM f xs = sequence (map f xs)

关于Haskell:如何处理另一个 IO monad 中的 IO monad?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7830743/

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