Функция flatten
должна возвращать последовательность, а не одну вещь.
Для элементов с подэлементами необходимо вызвать flatten
для каждого, а затем объединить все результаты:
e.Elements() |> Seq.map flatten |> Seq.concat
(обратите внимание, что XElement.Elements
- это метод, а несвойство, поэтому для его вызова необходимо добавить ()
)
Для одного элемента просто вернуть его имя, заключенное в последовательность из одного элемента:
Seq.singleton e.Name.LocalName
Собираем все вместе:
let rec flatten (e : System.Xml.Linq.XElement) =
if e.HasElements
then e.Elements() |> Seq.map flatten |> Seq.concat
else Seq.singleton e.Name.LocalName
(также обратите внимание, что я удалил ваш параметр out
, который, как я предполагаю, должен был быть не параметром, а попыткой объявить функциютип возвращаемого значения; его можно опустить; для справки: тип возвращаемого значения функции в F # объявляется после сигнатуры функции с двоеточием, например, let f (x:int) : int = x + 5
)
Если вы предпочитаете более императивныйсмотря стиль, вы можете использовать вычислительное выражение seq
.yield
даст один элемент, в то время как yield!
будет давать каждый элемент другой последовательности:
let rec flatten (e : System.Xml.Linq.XElement) =
seq {
if e.HasElements then
for i in e.Elements() do
yield! flatten i
else
yield e.Name.LocalName
}