Ya, that code doesn't work. The reason is because path' is not correct past the first level.
The line "let path' = path </> name " is the crux of the bug, because 'path' never changes!
To fix it, I added an extra argument to 'fold' that keeps track of the current subpath:
http://haskell.pastebin.com/mc9a9c8f< fold seed subpath = getUsefulContents subpath >>= walk seed
---
> fold seed subpath = getUsefulContents subpath >>= walk subpath seed
25,26c25,26
< walk seed (name:names) = do
< let path' = path </> name
---
> walk dir seed (name:names) = do
> let path' = dir </> name
30c30
< Skip seed' -> walk seed' names
---
> Skip seed' -> walk path' seed' names
33a34
> next <- fold seed' path'
36,38c37,39
< seed'' -> walk (unwrap seed'') names
< | otherwise -> walk seed' names
< walk seed _ = return (Continue seed)
---
> seed'' -> walk path' (unwrap seed'') names
> | otherwise -> walk path' seed' names
> walk _ seed _ = return (Continue seed)
btw: Debug.Trace is your friend.
Chris