2

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

1 回答 1

7

你不能只使用

mapM putStrLn (ls ".")

因为ls "."有 type IO [FilePath],并且mapM putStrLn期望 just [FilePath],所以你需要使用 bind,或者>>=在 Haskell 中。所以你的实际线路是

main = ls "." >>= mapM_ putStrLn

注意mapM_函数,而不仅仅是mapM. mapM会给你IO [()]类型,但main你需要IO (),这就是mapM_目的。

于 2013-05-06T16:48:01.653 回答