#f# #upcasting
#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) ]
Как я мог бы определить cast
функцию NestedList<'T>
? (например Seq.cast
)
Комментарии:
1.
let xxs: NestedList<_> = [ [ XX() :> X ] ]
Я думаю.2. @SerejaBogolubov да, это сработало бы, но что, если
xss
тоже задано. Я отредактировал вопрос.
Ответ №1:
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
PS Я настоятельно рекомендую избегать ненужных абстракций, как NestedList<'T>
в вашем примере.