F# 如何从地图构造键列表?

F# 如何从地图构造键列表?,f#,F#,我正试图从地图构建一个键列表。我就是这么做的: Map.fold (fun state key value -> state::value) [] [("one", 1); ("two", 2)] 但是,位state::value会产生以下错误: tryout.fs(146,48): error FS0001: Type mismatch. Expecting a 'a but given a 'a list 我的代码怎么了?两个问题: -您传递的不是地图,而是

我正试图从
地图
构建一个键列表。我就是这么做的:

Map.fold (fun state key value -> state::value) [] [("one", 1); ("two", 2)]
但是,位
state::value
会产生以下错误:

tryout.fs(146,48): error FS0001: Type mismatch. Expecting a
    'a    
but given a
    'a list
我的代码怎么了?

两个问题: -您传递的不是地图,而是列表。 -状态(关键帧折叠到的结果)和值(int)反转

您可以将列表转换为地图(参见Daniel的评论):

或者,您可以折叠元组列表:

["one", 1; "two", 2]
|> List.fold (fun state (key, value) -> value :: state) [];;
// val it : int list = [2; 1]

其他人已经发布了很好的解决方案,所以只需回答您的问题并解释代码的错误-因为您使用的是
Map.fold
我假设您的数据源实际上是一个地图而不是列表:

let sample = Map.ofSeq [("one", 1); ("two", 2)]
这是您的原始解决方案,也是一个并行工作的解决方案:

// Original version - attempts to add 'state' as the new head of a list 'value'
Map.fold (fun state key value -> state::value) [] sample
// Corrected version - adds 'key' as the new head of a list 'state'
Map.fold (fun state key value -> key::state) [] sample
关键是,
操作符需要在左侧有一个值(此处为
字符串
),在右侧有另一个列表(此处为
字符串列表
)。您正确地创建了一个空列表
[]
作为初始状态

如果要在折叠过程中添加新键,需要将现有列表(
state
)作为
的右参数传递,将新键(
key
)作为左参数传递,以创建一个新列表,其中包含键作为列表的第一个元素,所有剩余元素作为列表的其余(尾部)


因此,1)参数的顺序::很重要,2)您想收集键而不是值,但如果您收集值,它将以相同的方式工作。

map.toSeq |>Seq.map fst |>Seq.toList但不确定Seq.map fst,fst从何而来?它是一个内置的。@Daniel
Map.toSeq
返回一个
KeyValuePair
序列,因此正确的版本是
Map>Seq.Map(fun-kv->kv.Key)|>Seq.toList
@EugeneFotin:不,签名是:。
// Original version - attempts to add 'state' as the new head of a list 'value'
Map.fold (fun state key value -> state::value) [] sample
// Corrected version - adds 'key' as the new head of a list 'state'
Map.fold (fun state key value -> key::state) [] sample