在下面的示例中,我希望能够直接调用“ ls”函数(请参见示例的最后注释掉的行),但是我无法弄清楚正确的语法。
提前致谢。
module Main (main) where
import System.Directory
ls :: FilePath -> IO [FilePath]
ls dir = do
fileList <- getDirectoryContents dir
return fileList
main = do
fileList <- ls "."
mapM putStrLn fileList
-- How can I just use the ls call directly like in the following (which doesn't compile)?
-- mapM putStrLn (ls".")
最佳答案
你不能只用
mapM putStrLn (ls ".")
因为
ls "."
的类型为IO [FilePath]
,而mapM putStrLn
的期望值为[FilePath]
,所以您需要在Haskell中使用bind或>>=
。所以你的实际行是main = ls "." >>= mapM_ putStrLn
注意
mapM_
函数,而不仅仅是mapM
。 mapM
将为您提供IO [()]
类型,但对于main
,您需要IO ()
,这就是mapM_
的用途。关于haskell - 如何直接调用Monad函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16403204/