Haskell 不能';无法将类型[]与IO匹配
我的程序应该遍历给定目录中的所有文件,并为每个文件的内容附加一个扩展名为“.vm”的计数器。但是,它在追加中有一个错误“无法使用IO处理类型[]”。 如果有人能帮上忙,我会非常高兴的 我的代码:Haskell 不能';无法将类型[]与IO匹配,haskell,Haskell,我的程序应该遍历给定目录中的所有文件,并为每个文件的内容附加一个扩展名为“.vm”的计数器。但是,它在追加中有一个错误“无法使用IO处理类型[]”。 如果有人能帮上忙,我会非常高兴的 我的代码: import System.IO import qualified Data.ByteString.Lazy.Char8 as B import Control.Applicative import Data.List import System.Directory import System.File
import System.IO
import qualified Data.ByteString.Lazy.Char8 as B
import Control.Applicative
import Data.List
import System.Directory
import System.FilePath
main = do
files <- getDirectoryContents "c:/program file"
let filtered = filter ( vmExtention ) files
[ appendFile x y| x<-filtered, y <- [0..] ]
print filtered
print files
vmExtention :: FilePath-> Bool
vmExtention s =
if ( takeExtension s )== ".vm" then True else False
import System.IO
将限定数据.ByteString.Lazy.Char8作为B导入
导入控制
导入数据。列表
导入系统目录
导入System.FilePath
main=do
文件夹
但是,这是行不通的,因为y
必须是字符串
,而[0..]
是一个无限列表,因此您将以
appendFile x 0
appendFile x 1
appendFile x 2
appendFile x 3
...
你想带点什么吗
sequence [appendFile file (show counter) | (file, counter) <- zip filtered [0..]]
sequence[appendFile文件(显示计数器)|(文件,计数器)
但是,这是行不通的,因为y
必须是字符串
,而[0..]
是一个无限列表,因此您将以
appendFile x 0
appendFile x 1
appendFile x 2
appendFile x 3
...
你想带点什么吗
sequence [appendFile file (show counter) | (file, counter) <- zip filtered [0..]]
sequence[appendFile file(show counter)|(file,counter)在代码中,文件是IO操作的列表([IO()]
),因此,要执行列表中的IO操作,只需调用序列文件
。但是,您还需要纠正列表理解-目前,它将尝试将[0..]
范围内的所有整数添加到第一个文件的末尾(列表中的范围从左到右嵌套,即,x在您的代码中,文件是IO操作的列表([IO()]
),因此,要执行列表中的IO操作,只需调用序列文件
。但是,您还需要纠正列表理解-目前,它将尝试将[0..]
范围内的所有整数添加到第一个文件的末尾(列表中的范围从左到右嵌套,即给定ximport System.IO
将限定数据.ByteString.Lazy.Char8作为B导入
导入控制
导入数据。列表
导入系统目录
导入System.FilePath
导入调试跟踪
调试=翻转跟踪
main=do
let path=“/tmp/test”
档案室
VMExtension s=
takeExtension s==“.vm”
导入系统.IO
将限定数据.ByteString.Lazy.Char8作为B导入
导入控制
导入数据。列表
导入系统目录
导入System.FilePath
导入调试跟踪
调试=翻转跟踪
main=do
let path=“/tmp/test”
档案室
VMExtension s=
takeExtension s==“.vm”
如果条件为真,则其他为假
应写成条件
。不要让事情变得更复杂。如果条件为真,则其他为假
应写成条件
。不要让事情变得更复杂。
let files = [appendFile (path </> x) (show y) | zip filtered [0..] ]
import System.IO
import qualified Data.ByteString.Lazy.Char8 as B
import Control.Applicative
import Data.List
import System.Directory
import System.FilePath
import Debug.Trace
debug = flip trace
main = do
let path = "/tmp/test"
files <- getDirectoryContents path
let filtered = filter ( vmExtention ) files
let filteredWithIndex = zip filtered [0..]
sequence_ [ appendFile' (path </> fp) (show i) | (fp,i) <- filteredWithIndex ]
appendFile' fp s =
-- note that the path was relative but is now fixed
appendFile fp s `debug` ("filepath: " ++ fp)
vmExtention :: FilePath-> Bool
vmExtention s =
takeExtension s == ".vm"