Какой самый простой способ преобразовать типизированный список в seq‹_› в F#?

(Вопрос новичка) Какой самый простой способ преобразовать типизированный список в seq‹_› в F#?

Я работаю над взаимодействием с С# и пытаюсь изучить F#. У меня есть список фильмов, определенных как:

Movies: MovieInfo list option

который я хотел бы преобразовать в

 ItemsSource: seq<obj> option

Итак, учитывая фильмы, как мне перейти к ItemsSource?

например, фильмы |› ?????

Спасибо за любую помощь.


person Alan Wayne    schedule 29.07.2021    source источник
comment
Не уверен, что это самое простое, но Seq.ofList справится с этой задачей. Если вам нужен гипс, вы можете использовать Seq.Cast. movies |> Seq.ofList |> Seq.cast<obj>   -  person 3615    schedule 29.07.2021


Ответы (2)


На самом деле здесь есть две небольшие задачи: (1) преобразовать список в последовательность, о чем вы спрашивали, и (2) сделать это внутри option.

Преобразовать список в последовательность очень просто: Seq.ofList. Кроме того, если вам нужно привести тип элемента, используйте Seq.cast:

let movies: MovieInfo list = ...
let itemsSource = movies |> Seq.ofList |> Seq.cast

Но это еще не все: у вас нет голого списка MovieInfo list, он есть внутри option - MovieInfo list option. И способ применить преобразование к значению внутри опции через Option.map:

let x = Some 3
let y = x |> Option.map ((+) 2)  // now, y = Some 5

Итак, чтобы объединить все вышеперечисленное:

let ItemsSource = Movies |> Option.map (Seq.ofList >> Seq.cast)
person Fyodor Soikin    schedule 29.07.2021

Использование Seq.cast приводит к накладным расходам на создание нового перечисляемого, которое обертывает исходный, см. rel="nofollow noreferrer">источник. Лучше использовать кастинг.

let movies : MovieInfo list = []
let moviesAsObj = movies :> seq<_> :?> seq<obj>
// and if it's inside `option`
let moviesOpt = Some movies
let moviesAsObjOpt = moviesOpt |> Option.map (fun m -> m :> seq<_> :?> obj)

Идея взята из здесь

person JL0PD    schedule 30.07.2021