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

関数の引数 to にSeq.iteriは 2 つの引数が必要であり、 type を持つ必要があります(int -> 'T -> unit)。その file パラメータには type があると推測されるintため、ifステートメントには type があるはずですstring -> unitが、実際には typeunitがあるため、エラーが発生します。

int引数を必要としないように見えるので、Seq.iter代わりに使用できます。

ただし、次のようなものを使用して実行できるように見えます。

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

@Leeの答えに加えて、いくつかの発言があります:

  • エラーを回避する 1 つの方法は、for代わりに loop を使用することですSeq.iter(i)forクロージャーに対処しなくても、ループの方が読みやすいことがわかりました。
  • System.Collections.Generic.List<T>という名前で F# に存在しResizeArrayます。F# PowerPack には、必要なすべての高次関数を備えたResizeArray モジュールもあります。
  • =の代わりに1 つを使用する必要があります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 に答える