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)) часть...

Почему это неправильно и как мне это исправить?

2 ответа

Решение

Аргумент функции для Seq.iteri требует двух аргументов и должен иметь тип (int -> 'T -> unit), Предполагается, что его параметр файла имеет тип 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, У вас даже есть модуль ResizeArray в F# PowerPack со всеми необходимыми функциями высокого порядка.
  • Один должен тебе = вместо obj.Equals,

Применяя приведенные выше комментарии, ваше решение выглядит так:

let jackFiles = ResizeArray()
for file in Directory.GetFiles(dir) do
    if Path.GetExtension(file) = ".jack" then jackFiles.Add(file)
Другие вопросы по тегам