我正在进行递归树行走。我想要类似下面的内容(Haskell伪代码):
walkTree step root = do
dsc <- getDescendants root
for d in dsc
nextStep = increase step d
walkTree nextStep d
当然,对我来说没有迭代。但是,我无法弄清楚映射解决方案。如何管理step
事?
UPD:
让我们试试映射:
walkTree step root = do
dsc <- getDescendants root
nextStep = increase step d
mapM (walkTree nextStep) dsc
两个问题:nextStep
被冻结用于映射;也无法获得d
(次要的)
答案 0 :(得分:1)
最终解决方案,由user2407038提供(见问题评论)。这是运行代码的片段(它是DFS吗?):
-- | Walks the source tree, recreates source tree at destination.
traverseTreeDst :: Settings -> FilePath -> Int -> Int -> Counter -> FilePath -> FilePath -> IO ()
traverseTreeDst args dstRoot total totw counter dstStep srcDir = do
(dirs, files) <- listDir args srcDir
let traverse dir = do
let step = dstStep </> basename dir
mkdir (dstRoot </> step)
traverseTreeDst args dstRoot total totw counter step dir
mapM_ traverse dirs
mapM_ (copyFile args dstRoot total totw counter dstStep) files
您可能会看到我使用伪代码的原因。很多不必要的细节,但就是这样。该东西复制音频文件,破坏其名称,并设置标签。没什么。
我不介意讨论相关的术语。你如何描述这种问题和这种解决方案?