如何直接调用Monad函数?

时间:2013-05-06 16:39:17

标签: haskell monads

在下面的示例中,我希望能够直接调用'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".")

1 个答案:

答案 0 :(得分:7)

你不能只使用

mapM putStrLn (ls ".")

因为ls "."的类型为IO [FilePath],而mapM putStrLn只需要[FilePath],所以您需要在Haskell中使用bind或>>=。所以你的实际行将是

main = ls "." >>= mapM_ putStrLn

请注意mapM_功能,而不只是mapMmapM会为您提供IO [()]类型,但对于main,您需要IO (),这就是mapM_的用途。