如何在 F# 中转换泛型集合

How to cast generic collections in F#

给出

type X () = class  end    

type XX () =  inherit X() 

type NestedList<'T> = list<list<'T>>

let xxs  = [[ XX() ]] // list<list<XX>>

list<list<XX>> 转换为 NestedList<X> 的最佳方法是什么?

这失败了:

let xs = xxs :> NestedList<X> //fails

这可行,但会重新分配列表。有没有更优雅的方式无需重新分配?

let xs : NestedList<X> = [ for xx in xxs do yield List.ofSeq (Seq.cast<X> xx) ]

如何在 NestedList<'T> 上定义 cast 函数? (喜欢Seq.cast

let cast xxs = xxs |> List.map (List.map (fun e -> e :> X)) 可以胜任。

更奇特的方式:

let mapNested f = (List.map >> List.map) f
let cast xxs = mapNested (fun e -> e :> X) xxs

P.S。我强烈建议避免不必要的抽象,例如您示例中的 NestedList<'T>