Haskell 如何直接调用Monad函数?

Haskell 如何直接调用Monad函数?,haskell,monads,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 <- l

在下面的示例中,我希望能够直接调用“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".")
主模块(Main),其中
导入系统目录
ls::FilePath->IO[FilePath]
ls dir=do
文件列表您不能只使用

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

main = ls "." >>= mapM_ putStrLn

请注意
mapM
函数,而不仅仅是
mapM
mapM
将为您提供
IO[()]
类型,但是对于
main
您需要
IO()
,这就是
mapM
的用途。

mapM\putStrLn=为什么不
ls=getDirectoryContents
?首先,感谢您的回答。我还没有完全理解它(我还没有看到'>>=',但我现在会研究它)。在经历了35年的结构化和面向对象编程之后,开始学习像Haskell这样的语言是一个有趣的挑战,但我相信这是值得的,尽管我有很多“婴儿”问题。