在 F# 中,将类型列表向上转换为 seq<_> 的最简单方法是什么?

In F#, what is the simplest method of upcasting a typed list to a seq<_>?

(新手问题)在 F# 中,将类型列表向上转换为 seq<_> 的最简单方法是什么?

我正在研究与 C# 的互操作并尝试学习 F#。我有一个明确定义的电影列表:

Movies: MovieInfo list option

我想向上转换为

 ItemsSource: seq<obj> option

给定 Movies,我该如何转到 ItemsSource?

例如,电影 |> ??????

感谢您的帮助。

这里实际上有两个小任务:(1) 将列表转换为序列,这就是您询问的内容,以及 (2) 在 option.[=20= 的“内部”进行]

将列表转换为序列很容易: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)

Seq.cast 的使用有创建新枚举的开销,它包装了原始的,请参阅 source。最好使用铸造

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)

灵感来自 here