2017-12-14 2 views
1

나는 재귀 트리 워킹을하고있다. 나는 다음과 같은 것을 원한다. (하스켈 의사 코드)하스켈 : 재귀 매핑 어려움

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

항상 처리중인 모든 데이터에 대한 유형 서명 및 참조 또는 정의를 추가하십시오. – leftaroundabout

+0

이것은 의사 코드입니다. 그렇지 않습니까? 'root'는 트리 노드이고,'dsc'는 직계 하위 노드의리스트이고,'step'은 아직 변경 및 전달 대상이 아닙니다. –

+1

솔루션 시도에 대해 의사 코드를 게시하는 것은 괜찮지 만, 여러분이 말하는 데이터 구조와 알고리즘의 _purpose_ (즉, 유형 서명)가 무엇인지 제대로 알 필요가 있습니다. – leftaroundabout

답변

1

최종 해결책은 user2407038입니다 (질문에 대한 의견 참조). 나는 의사에게 의지하는 이유

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

당신은 아마 참조 :이 코드를 실행의 조각 (?는 DFS입니다)입니다. 불필요한 세부 사항이 많지만, 아직까지는 그렇지 않습니다. 이 파일은 오디오 파일을 복사하고 이름을 변경하며 태그를 설정합니다. 별로.

관련 용어에 관해서는 언급하지 않겠습니다. 이런 종류의 문제와 이런 종류의 해결책을 어떻게 묘사하고 있습니까?