Haskell:递归映射难度

时间:2017-12-14 15:52:12

标签: haskell recursion mapping

我正在进行递归树行走。我想要类似下面的内容(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(次要的)

1 个答案:

答案 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

您可能会看到我使用伪代码的原因。很多不必要的细节,但就是这样。该东西复制音频文件,破坏其名称,并设置标签。没什么。

我不介意讨论相关的术语。你如何描述这种问题和这种解决方案?