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