Data.List
패키지 술어에 기초 a
의 두 목록의 튜플로 a
의 목록을 분리 partition :: (a -> Bool) -> [a] -> ([a],[a])
기능을 갖는다.
그러나 파일이 디렉토리인지 확인하는 경우 isDirectory :: FilePath -> IO Bool
을 사용하므로 IO Bool
이 Bool
과 같지 않기 때문에이를 술어로 직접 사용할 수 없습니다.
그러나 우리는 우리 자신의 partitionM
을 작성하고, 하나의 것을 사용할 수 있습니다 : 우리가 수행 할 필요가 있기 때문에, 그것이 IO ([FilePath], [FilePath])
것을
import System.Directory(isDirectory)
getFilesAndDirs :: [FilePath] -> IO ([FilePath], [FilePath])
getFilesAndDirs = partitionM isDirectory
참고 :
이
import Data.Bool(bool)
import Data.Foldable(foldrM)
partitionM :: (Foldable t, Monad m) => (a -> m Bool) -> t a -> m ([a], [a])
partitionM p = foldrM (selectM p) ([],[])
selectM :: Monad m => (a -> m Bool) -> a -> ([a], [a]) -> m ([a], [a])
selectM p x (ts,fs) = p x >>= return . bool (ts, x:fs) (x:ts,fs)
우리는 다음처럼 사용할 수 있습니다 I/O를 사용하여 경로가 실제로 디렉토리인지 (파일이 아닌지) 확인하십시오.
'Data.List'에는 요청한 것처럼 보이는'partition' 함수가 있습니다. –
@ MarkSeemann : 여기에있는 문제는 술어가 모나드 ('FilePath -> IO Bool') –
관련 항목이라고 생각합니다. 관련 항목 : https://stackoverflow.com/q/31419429/126014 –