Как использовать общие коллекции в F#

#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> в вашем примере.