Причина, по которой он не скомпилируется, заключается в том, что все ветви match
должны возвращать один и тот же тип объекта. Ваш текущий код возвращает либо XElement
, либо Array
. Поскольку имя функции obj2xml
, я думаю, что правильный тип - XElement
.
Это означает, что вам нужно каким-то образом обернуть массив в XElement
. Я собираюсь предположить, что r
является сокращением от «root» и что, поскольку все остальные возвращенные XElements имеют r
в качестве первого аргумента, вы должны передать это.
| A -> o |> Array.map (fun z -> obj2xml r z)
// change to:
| A -> new XElement(r, o |> Array.map (fun z -> obj2xml r z))
Кстати, я не знаю, используете ли вы Visual Studio для написания этого кода. Если да, то вы, вероятно, захотите указать свои ссылки через систему проекта, а не #r
директивы компилятора.