Haskell 不能';无法将类型[]与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

我的程序应该遍历给定目录中的所有文件,并为每个文件的内容附加一个扩展名为“.vm”的计数器。但是,它在追加中有一个错误“无法使用IO处理类型[]”。 如果有人能帮上忙,我会非常高兴的

我的代码:

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..]
范围内的所有整数添加到第一个文件的末尾(列表中的范围从左到右嵌套,即给定
x
import 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"