Вы можете посмотреть на модуль Distribution.Compat.TempFile
источника Cabal для примера. Он определяет createTempDirectory
следующим образом (где c_getpid
и mkPrivateDir
зависят от платформы):
createTempDirectory :: FilePath -> String -> IO FilePath
createTempDirectory dir template = do
pid <- c_getpid
findTempName pid
where
findTempName x = do
let dirpath = dir </> template ++ show x
r <- try $ mkPrivateDir dirpath
case r of
Right _ -> return dirpath
Left e | isAlreadyExistsError e -> findTempName (x+1)
| otherwise -> ioError e
Тот факт, что Cabal определяет эту функцию, говорит о том, что не существует стандартного способа сделать это.