如何使用Haskell中的didFileExist函数过滤目录列表?

Kar*_*her -1 io haskell

我已经设法用这个Haskell代码打印目录列表:

import Control.Monad
import Control.Applicative
import System.Directory

main :: IO()
main = do
  all <- listDirectory "x:/n"
  mapM_ print all
Run Code Online (Sandbox Code Playgroud)

但是现在我想用System.Direcorty模块中的didFileExist函数过滤所有函数,并且无法理解如何正确使用它:

import Control.Monad
import Control.Applicative
import System.Directory

main :: IO()
main = do
  all <- listDirectory "x:/n"
  mapM_ print (filterM doesFileExist all) 
Run Code Online (Sandbox Code Playgroud)

上面的代码没有编译错误:

  * No instance for (Foldable IO) arising from a use of `mapM_'
* In a stmt of a 'do' block:
    mapM_ print (filterM doesFileExist all)
  In the expression:
    do all <- listDirectory "x:/n"
       mapM_ print (filterM doesFileExist all)
  In an equation for `main':
      main
        = do all <- listDirectory "x:/n"
             mapM_ print (filterM doesFileExist all)

   mapM_ print (filterM doesFileExist all)
   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

我想我已经错过了一些基本的东西,所以,请帮我找到理解我所缺少的方法.谢谢

chi*_*chi 5

使用另一个<-:

main = do
  all <- listDirectory "x:/n"
  filtered <- filterM doesFileExist all
  mapM_ print filtered
Run Code Online (Sandbox Code Playgroud)