List 通过F中的Map.iter函数从映射构建列表#

List 通过F中的Map.iter函数从映射构建列表#,list,f#,map,List,F#,Map,我有以下几种: type ColorCounter = { Count : int Color : Microsoft.Xna.Framework.Color } let AvailableColors : Map<uint32,ColorCounter> = ..... 类型颜色计数器= { 计数:int 颜色:Microsoft.Xna.Framework.Color } 让可用颜色:Map=。。。。。 我想遍历映射并

我有以下几种:

type ColorCounter = 
    {

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

    }

let AvailableColors : Map<uint32,ColorCounter> = .....
类型颜色计数器=
{
计数:int
颜色:Microsoft.Xna.Framework.Color
}
让可用颜色:Map=。。。。。
我想遍历映射并返回一个列表。我编写了以下未编译的函数:

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
let AvailableColorList(映射:映射):列表=
设colorSeq=seq{
map |>map.iter(趣味键颜色->产量颜色)
}
colorSeq |>Seq.toList
我想我对传递给iter的函数的语法做了一些错误,但我还没有找到任何合适的例子来说明如何做到这一点

有人能帮我吗?我怎么了?如何修复上面的代码?

我想您需要这个

let AvailableColorList(map : Map<uint32,ColorCounter>) = 
    ResizeArray(map |> Seq.map (fun (KeyValue(_, col)) -> col.Color))
let AvailableColorList(map:map)=
调整数组大小(map |>Seq.map(fun(KeyValue(|,col))->col.Color))
你混合了序列理解和映射,这是做同一件事的两种不同方式

你也可以这样写

let AvailableColorList(map : Map<uint32,ColorCounter>) = 
    ResizeArray([ for KeyValue(_, col) in map -> col.Color ])
let AvailableColorList(map:map)=
调整数组大小([用于映射->列颜色中的键值(\ux,列)])
我想你想要这个

let AvailableColorList(map : Map<uint32,ColorCounter>) = 
    ResizeArray(map |> Seq.map (fun (KeyValue(_, col)) -> col.Color))
let AvailableColorList(map:map)=
调整数组大小(map |>Seq.map(fun(KeyValue(|,col))->col.Color))
你混合了序列理解和映射,这是做同一件事的两种不同方式

你也可以这样写

let AvailableColorList(map : Map<uint32,ColorCounter>) = 
    ResizeArray([ for KeyValue(_, col) in map -> col.Color ])
let AvailableColorList(map:map)=
调整数组大小([用于映射->列颜色中的键值(\ux,列)])
让可用颜色:Map=Map.empty
让颜色=[对于可用颜色中的(KeyValue(u,v))->v]
让可用颜色:Map=Map.empty
让颜色=[对于可用颜色中的(KeyValue(u,v))->v]

好的,谢谢你的回答。但我仍然不明白,如果我将AvailableColorList的返回类型指定为List,为什么它不会编译。实际上,它似乎返回一个(ColorCounter->Microsoft.Xna.Framework.Color)列表,而不是一个列表。我错了吗?如果你想要
System.Collection.Generic.List
(在F#中别名为
ResizeArray
),你可以这样做:
ResizeArray([map->col.Color]中的KeyValue(\uu,col))实际上你的第二个解决方案甚至可以指定返回类型。这是第一个看起来不一样的。很抱歉这么坚持,但我确实在努力理解这种语言。如果第一个函数的返回类型为
List Color>
,那么我想我知道发生了什么。这是一个函数列表,它接受一个颜色计数器并返回一个颜色。Seq.map函数的签名错误。序列中的每一项要么是
(uint32*colortcounter)
元组,要么是
KeyValuePair
。在任何一种情况下,包含两个值的单个项都会传递给
(fun\ucol->col.Color)
中的第一个(忽略的)参数。只提供一个参数的结果是函数接受另一个参数。好的,谢谢你的回答。但我仍然不明白,如果我将AvailableColorList的返回类型指定为List,为什么它不会编译。实际上,它似乎返回一个(ColorCounter->Microsoft.Xna.Framework.Color)列表,而不是一个列表。我错了吗?如果你想要
System.Collection.Generic.List
(在F#中别名为
ResizeArray
),你可以这样做:
ResizeArray([map->col.Color]中的KeyValue(\uu,col))实际上你的第二个解决方案甚至可以指定返回类型。这是第一个看起来不一样的。很抱歉这么坚持,但我确实在努力理解这种语言。如果第一个函数的返回类型为
List Color>
,那么我想我知道发生了什么。这是一个函数列表,它接受一个颜色计数器并返回一个颜色。Seq.map函数的签名错误。序列中的每一项要么是
(uint32*colortcounter)
元组,要么是
KeyValuePair
。在任何一种情况下,包含两个值的单个项都会传递给
(fun\ucol->col.Color)
中的第一个(忽略的)参数。只提供一个参数的结果是函数接受另一个参数。