Предполагая, что вы вызываете этот Builders.Update.Push метод, вам придется явно привести или преобразовать список в последовательность, либо напрямую, либо вызвав Seq.ofList , которыйделает это так:
[<CompiledName("OfList")>]
let ofList (source : 'T list) =
(source :> seq<'T>)
Обычный и гораздо более читаемый способ - использовать Seq.ofList
, поэтому вы должны использовать:
let update = Builders.Update.Push<string>((fun x -> x.users |> Seq.ofList), usr)
Объяснение
Причина этого в том, что Push
ожидает функцию, которая возвращает IEnumerable<T>
.Его синтаксис:
static member Push :
memberExpression : Expression<Func<'TDocument, IEnumerable<'TValue>>> *
value : 'TValue -> UpdateBuilder<'TDocument>
Список реализует интерфейс IEnumerable<T>
:
type List<'T> =
| ([]) : 'T list
| (::) : Head: 'T * Tail: 'T list -> 'T list
interface System.Collections.Generic.IEnumerable<'T>
...
Компилятор F # не может неявно приводиться к интерфейсу вдело вопроса хотя.
A seq
с другой стороны - это псевдоним типа для IEnumerable<T>
:
type seq<'T> = IEnumerable<'T>
Seq.ofList
приведёт список users
кIEnumerable<string>
, что Push
ожидает