我想編寫一個函數,它可以在Haskell中以寬度優先的方式遞歸列出目錄。 正如你所看到的,我需要一個可以將(a - > IO b)轉換爲IO(a-> b)的函數。看起來很簡單,我無法做到。我想知道該怎麼做或者是否有可能。如何在Haskell中使用 - > IO b來創建IO(a-> b)函數
dirElem :: FilePath -> IO [FilePath]
dirElem dirPath = do
getDirectoryContents'' <- theConvert getDirectoryContents'
return $ takeWhile (not.null) $ iterate (concatMap getDirectoryContents'') [dirPath] where
getDirectoryContents' dirPath = do
isDir <- do doesDirectoryExist dirPath
if isDir then dirContent else return [] where
dirContent = do
contents <- getDirectoryContents dirPath
return.(map (dirElem</>)).tail.tail contents
theConvert :: (a -> IO b) -> IO (a -> b)
theConvert = ??????????
我一般你不能那樣做。但我認爲你不需要這裏。我想你可以在這裏使用'getDirectoryContents'' – Satvik
是的,但沒有(a - > IO b) - > IO(a - > b)我必須編寫iterate,concatMap等Monadic版本。也許有一個簡單的方法來編寫(a - > IO b) - > IO(a - > b),這將帶來很多好處。 – TorosFanny
@TorosFanny這是要走的路。你的一些combinators需要是monadic。 – sdcvvc