Data.List
パッケージには、述語に基づいてa
Sの二つのリストのタプルにa
のリストを分割partition :: (a -> Bool) -> [a] -> ([a],[a])
機能を持っています。
ただし、ファイルがディレクトリであるかどうかを確認するときは、isDirectory :: FilePath -> IO Bool
を使用します(IO Bool
はBool
と等しくないため、これを直接述語として使用できません)。
私たちは、しかし、私たち自身のpartitionM
を書き、1という使用することができます。
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)
我々はそれが好きで使用することができます:我々は実行する必要があるため、それは、IO ([FilePath], [FilePath])
であること
import System.Directory(isDirectory)
getFilesAndDirs :: [FilePath] -> IO ([FilePath], [FilePath])
getFilesAndDirs = partitionM isDirectory
注意I/Oを使用して、パスが実際にディレクトリであるかどうか(ファイルではない)を確認します。
'Data.List'には、あなたが求めるもののように見える' partition'という関数があります。 –
@ MarkSeemann:ここでの問題は、述語がモナドであることです( 'FilePath - > IO Bool') –
関連:https://stackoverflow.com/q/31419429/126014 –