2012-05-30 98 views
0

我是F#的新手,我很想得到一些幫助:)Fsharp - 類型編譯錯誤

我有嗎?這個代碼編譯錯誤,我不能弄明白:

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

編譯器呼喊此錯誤:

This expression was expected to have type string->unit but here has type unit

有關if ((Path.GetExtension(file)).Equals(".jack")) then JackFiles.Add(file))部分...

爲什麼是錯的我該如何解決它?

回答

2

Seq.iteri的函數參數需要兩個參數,並且應該有(int -> 'T -> unit)類型。它的文件參數被推斷爲具有類型int,因此您的if語句應具有類型string -> unit,但實際上具有類型unit,因此是錯誤。

它看起來就像你不需要int參數,因此你可以使用Seq.iter代替。

然而,它看起來像你想要做什麼可以使用類似的東西來完成:

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

這是正確的....感謝ü非常感謝! – cookya

1

除了@李的回答,我有幾點看法:

  • 的一種方式避免你的錯誤是使用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) 
+0

謝謝!但爲什麼使用=而不是obj.Equals? – cookya

+0

@cookya:它們在這裏意思相同,'='更短更實用。 – pad

+0

好的,謝謝:) – cookya