[Haskell-beginners] Help! Trapped in the IO Monad!

Erik de Castro Lopo mle+cl at mega-nerd.com
Tue Jan 27 23:07:01 EST 2009

Hi all,

I have a list of entries for a directory (FilePaths) and I'd like to
partition them into files and directories using Data.List.partition:

    partition :: [a] -> ([a], [a])

Now, one solution is to use unsafePerformIO:

    splitDirFile :: [FilePath] -> ([FilePath], [FilePath])
    splitDirFile paths = do
        partition (\p -> unsafePerformIO (doesDirectoryExist p)) paths

Two questions:

  a) Is it possible to do this without invoking unsafePerformIO? Ie with
     a function signature of say:

         partition :: [FilePath] -> IO ([FilePath], [FilePath])

  b) Exactly how unsafe is the unsafePerformIO version?

Erik de Castro Lopo
The main confusion about C++ is that its practitioners think
it is simultaneously a  high and low level language when in
reality it is good at neither.

More information about the Beginners mailing list