Haskell 如何直接调用Monad函数?
在下面的示例中,我希望能够直接调用“ls”函数(请参见示例的最后一行注释),但我还没有找到正确的语法。 提前谢谢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
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这样的语言是一个有趣的挑战,但我相信这是值得的,尽管我有很多“婴儿”问题。