我刚开始学习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?这种返回方式正常吗?
我甚至不能打印出这种返回结果。我需要为此创建一个show实例才能正确打印吗?
某些Haskell库中可能存在类似的函数,但这是为了教育目的而编写的。我想学习。因此,欢迎任何建议。
非常感谢。
join :: Monad m => m (m a) -> m a
。从签名中可以看出,它的整个目的就是“取消”那个额外的单子层级。就像梦境一样,嵌套在单子中的单子也只是单子而已 :) - Tom Crockettreturn
的含义与大多数编程语言中的含义非常不同。 - Dan Burton