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)
中的第一个(忽略的)参数。只提供一个参数的结果是函数接受另一个参数。