File 批处理修改文件Haskell

File 批处理修改文件Haskell,file,haskell,io,File,Haskell,Io,我正在尝试创建一个程序,将一个简单的文本头添加到目录及其子目录中的每个文件中。我只需要使用ghc的内置功能就可以做到这一点,我无法访问阴谋集团 函数的类型签名为 getRecursiveContents :: FilePath -> IO [FilePath] addHeaderToFile :: String -> FilePath -> IO () 这两个函数都可以独立工作,但由于类型不同,我很难将这两个函数结合使用。我认为使用地图是正确的方法,但到目前为止我一直没有成

我正在尝试创建一个程序,将一个简单的文本头添加到目录及其子目录中的每个文件中。我只需要使用ghc的内置功能就可以做到这一点,我无法访问阴谋集团

函数的类型签名为

getRecursiveContents :: FilePath -> IO [FilePath]

addHeaderToFile :: String -> FilePath -> IO ()
这两个函数都可以独立工作,但由于类型不同,我很难将这两个函数结合使用。我认为使用地图是正确的方法,但到目前为止我一直没有成功

addHeaderToMultiple :: String -> IO [FilePath] -> IO ()
addHeaderToMultiple header files = map (addHeaderToFile header) files

我知道由于使用的类型,这将不起作用,但我还没有找到解决方法。

首先运行IO操作生成文件列表:

addHeaderToMultiple :: String -> IO [FilePath] -> IO ()
addHeaderToMultiple header files = do
   -- files has type IO [FilePath]
   paths <- files
   -- paths has type [FilePath], so we can map over that
   map (addHeaderToFile header) paths
   -- this produces [IO ()], which is not IO ()
可以简化为

runInSequence = foldr (>>) (return ())
实际上,已经有一个库函数在做这件事:它被称为sequence。我们的代码现在变成了

import Control.Monad
addHeaderToMultiple header files = do
   paths <- files
   sequence_ (map (addHeaderToFile header) paths)
   -- this produces IO (), so it's OK
这可以直接使用>>=进一步细化


首先运行IO操作生成文件列表:

addHeaderToMultiple :: String -> IO [FilePath] -> IO ()
addHeaderToMultiple header files = do
   -- files has type IO [FilePath]
   paths <- files
   -- paths has type [FilePath], so we can map over that
   map (addHeaderToFile header) paths
   -- this produces [IO ()], which is not IO ()
可以简化为

runInSequence = foldr (>>) (return ())
实际上,已经有一个库函数在做这件事:它被称为sequence。我们的代码现在变成了

import Control.Monad
addHeaderToMultiple header files = do
   paths <- files
   sequence_ (map (addHeaderToFile header) paths)
   -- this produces IO (), so it's OK
这可以直接使用>>=进一步细化


看一看mapM::Monad m=>a->mb->[a]->m。看一看mapM::Monad m=>a->mb->[a]->m。这很好地工作了,感谢您解释了整个过程中的步骤,这使它更容易理解。这很好地工作了,也感谢您解释了过程中的步骤,这使它更容易理解。