2011-12-15 1 views
0

У меня есть следующие типы:создать список из карты через функцию Map.iter в F #

type ColorCounter = 
    { 

     Count : int 
     Color : Microsoft.Xna.Framework.Color 

    } 

let AvailableColors : Map<uint32,ColorCounter> = ..... 

Я хотел бы перебирать карты и возвращает список. Я написал следующую функцию, которая не компилируется:

let AvailableColorList(map : Map<uint32,ColorCounter>) : List<Microsoft.Xna.Framework.Color> = 
    let colorSeq = seq { 

     map |> Map.iter (fun key col -> yield col.Color) 
    } 
    colorSeq |> Seq.toList 

Я предполагаю, что я делаю что-то неправильно с синтаксисом функции передается ITER, но я не нашел любой подходящий пример, который показывает мне, как сделай это.

Может ли кто-нибудь помочь мне? В чем моя ошибка? Как я могу исправить код выше?

ответ

1

Я думаю, что вы хотите, это

let AvailableColorList(map : Map<uint32,ColorCounter>) = 
    ResizeArray(map |> Seq.map (fun (KeyValue(_, col)) -> col.Color)) 

Вы смешении понимание последовательности и карты, которые являются двумя разными способами делать то же самое.

Вы также мог бы написать так

let AvailableColorList(map : Map<uint32,ColorCounter>) = 
    ResizeArray([ for KeyValue(_, col) in map -> col.Color ]) 
+0

хорошо, спасибо за ответ. Но я до сих пор не понимаю, почему он не компилируется, если я укажу тип возврата AvailableColorList как List . – Heisenbug

+0

И на самом деле он возвращает список (ColorCounter-> Microsoft.Xna.Framework.Color), а не List . Я ошибаюсь? – Heisenbug

+0

Если вы хотите 'System.Collection.Generic.List ' (который псевдоним как 'ResizeArray ' in F #), вы можете сделать: 'ResizeArray ([для KeyValue (_, col) в map -> col.Color]) ' – Daniel

1
let AvailableColors : Map<uint32,ColorCounter> = Map.empty 
let colors = [ for (KeyValue(_, v)) in AvailableColors -> v ] 
Смежные вопросы