0

我是 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))部分...

为什么它是错误的,我该如何解决?

4

2 回答 2

2

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

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

但是,看起来您尝试做的事情可以使用类似于以下内容来完成:

let jackFiles = Directory.GetFiles(dir, "*.jack")
于 2012-05-30T22:44:43.400 回答
1

除了@Lee 的回答,我还有几点意见:

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

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

let jackFiles = ResizeArray()
for file in Directory.GetFiles(dir) do
    if Path.GetExtension(file) = ".jack" then jackFiles.Add(file)
于 2012-05-31T01:38:56.840 回答