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)