Fsharp - 类型编译错误



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

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

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

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

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

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

除了@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)

相关内容

  • 没有找到相关文章

最新更新