在下面的示例中,我希望能够直接调用“ 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_函数,而不仅仅是mapMmapM将为您提供IO [()]类型,但对于main,您需要IO (),这就是mapM_的用途。

关于haskell - 如何直接调用Monad函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16403204/

10-12 16:33