我是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))
部分......
为什么会出错?如何解决?
答案 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)