我是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)