Fsharp - 类型编译错误

时间:2012-05-30 22:33:55

标签: f# filesystems fsharpchart

我是F#的新手,我很乐意得到一些帮助:)

我有吗?这段代码的编译错误,我无法弄清楚:

printfn "Please enter the path for the Jack file/s directory"
let dir = System.Console.ReadLine()
let jackFiles : List<String> = (new List<String>())
dir
|> Directory.GetFiles
|> Seq.iteri(fun file -> if ((Path.GetExtension(file)).Equals(".jack")) then JackFiles.Add(file))

编译器喊出这个错误:

  

此表达式应为string->unit类型,但此处的类型为unit

关于if ((Path.GetExtension(file)).Equals(".jack")) then JackFiles.Add(file))部分......

为什么会出错?如何解决?

2 个答案:

答案 0 :(得分:2)

Seq.iteri的函数参数需要两个参数,并且应该具有类型(int -> 'T -> unit)。其文件参数推断为类型int,因此您的if语句应该具有类型string -> unit,但实际上具有类型unit,因此错误。

看起来您不需要int参数,因此您可以使用Seq.iter

然而,看起来你要做的事情可以用类似的东西来完成:

let jackFiles = Directory.GetFiles(dir, "*.jack")

答案 1 :(得分:1)

除了@ Lee的回答,我还有几点评论:

  • 避免错误的一种方法是使用for循环而不是Seq.iter(i)。我发现for循环更易读,无需处理闭包。
  • System.Collections.Generic.List<T>存在于名为ResizeArray的F#中。你甚至在F#PowerPack中拥有ResizeArray module所有必需的高阶函数。
  • 您应该=而不是obj.Equals

应用上述评论,您的解决方案如下:

let jackFiles = ResizeArray()
for file in Directory.GetFiles(dir) do
    if Path.GetExtension(file) = ".jack" then jackFiles.Add(file)