我並不是哈斯克爾的新手,但在現實世界中並沒有太多用處。如何在haskell的文件系統中實現搜索?
所以我想要做的是從一些文件夾開始找到所有的git倉庫。基本上我試圖通過使用哈斯克爾併發功能來更快地完成這個工作find . -type d -exec test -e '{}/.git' ';' -print -prune
。
這就是我到目前爲止。
import Control.Concurrent.Async
import System.Directory (doesDirectoryExist)
import System.FilePath ((</>))
import System.IO (FilePath)
isGitRepo :: FilePath -> IO Bool
isGitRepo p = doesDirectoryExist $ p </> ".git"
main :: IO()
main = putStrLn "hello"
我發現這個lib具有這種功能mapConcurrently :: Traversable t => (a -> IO b) -> t a -> IO (t b)
這讓我想,我需要的是產生懶樹數據結構,將反映的文件夾結構。然後與isGitRepo
同時過濾,並將其摺疊到列表中並打印出來。 那麼,我當然知道如何製作data FTree = Node String [FTree]
或類似的東西,但我有問題。 如何同時生產?如何在遍歷樹時生成絕對路徑?像那樣的問題等等。
嘿!如果我想在可用時打印結果怎麼辦?有了這個版本,它只會在最後打印整個列表(比找到實際更快,這是好的,但仍然)。我可以使用渠道創建解決方案,但也許有更簡單的方法? – user1685095
@ user1685095我想一個頻道可能是要走的路......或者,你可以使用一些預先構建的東西。快速搜索產生https://hackage.haskell.org/package/concurrent-output-1.7.8/docs/System-Console-Concurrent.html – Alec