如何在 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>
。
给出
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>
。