F# 如何使用地图功能?

F# 如何使用地图功能?,f#,F#,因此,我有许多已经定义的类型和函数,它们将数据映射到这些记录/类型中。现在,我需要将每个记录/类型的内容映射到一个“主”记录中,该记录将根据一个键(在本例中为State)包含以前记录中的所有内容。我不知道如何去做这件事,但我在下面有我的尝试,以及提供上下文的更多代码。有什么建议吗?如果您需要更多信息,请发表评论 我有这样定义的类型: type StateEdu = { State : string Education : int Income : float }

因此,我有许多已经定义的类型和函数,它们将数据映射到这些记录/类型中。现在,我需要将每个记录/类型的内容映射到一个“主”记录中,该记录将根据一个键(在本例中为State)包含以前记录中的所有内容。我不知道如何去做这件事,但我在下面有我的尝试,以及提供上下文的更多代码。有什么建议吗?如果您需要更多信息,请发表评论

我有这样定义的类型:

type StateEdu = 
    { State : string
      Education : int
      Income : float }

type StateFamily =
    { State : string
      PctMoreThan4Children : float
      PctFamilyMorethan3 : float }
但现在我需要这样做(当我运行它时,它不起作用):


由于缺少变量和类型,所以不清楚您想要的输出是什么。假设您需要一个新的地图/字典,其中包含一个州的键,然后是一个记录,其中包含教育州和家庭州,一种方法是: (我添加了类型并修复了一些错误)

输出:

val statedatamap:Map=Map [(“AL”,{State=“AL”; StateEdu={State=“AL”; 教育=1; 收入=6481.0;}; StateFamily={State=“AL”; pct超过4名儿童=64.0; Pctfamily大于3=51.4;};}); (“CA”{State=“CA”; StateEdu={State=“CA”; 教育=2; 收入=79045.0;}; StateFamily={State=“CA”; 4名以上儿童=79.5; Pctfamily大于3=50.5;};}); (“MO”,{State=“MO”; StateEdu={State=“MO”; 教育=1; 收入=78921.0;}; StateFamily={State=“MO”; 4名以上儿童=78.92; Pctfamily大于3=25.1;};}); (“NY”,{State=“NY”; StateEdu={State=“NY”; 教育=1; 收入=79215.0;}; StateFamily={State=“NY”; pct超过4名儿童=25.15; PctFamilyMorethan3=31.0;};}); (“PA”,{State=“PA”; StateEdu={State=“PA”; 教育=2; 收入=79850.0;}; StateFamily={State=“PA”; 4名以上儿童=8.5; Pctfamily大于3=41.2;};}); (“TN”,{State=“TN”; StateEdu={State=“TN”; 教育=4; 收入=12000.0;}; StateFamily={State=“TN”; pct超过4名儿童=12.0; Pctfamily大于3=62.1;};}); (“TX”,{State=“TX”; StateEdu={State=“TX”; 教育=0; 收入=51522.0;}; StateFamily={State=“TX”; pct超过4名儿童=51.52; PctFamilyMorethan3=65.0;};}]


如有必要,您可以定义输出类型,将两个记录作为一个项目包括在内。您始终可以通过
statedu.[state]对记录进行索引。例如,教育

为什么不起作用?你能把它浓缩成一个小的例子吗?这将有助于确定一个好的解决方案。跳过csv提供程序,例如使用一些模拟数据。您收到的错误消息是什么?一般来说,仅仅说这不起作用是没有帮助的。您没有为最后一条记录定义类型,该记录的item
StateEdu
。您还缺少一些其他数据,如
statemap
。我添加了必要的更改,您需要您的记录将其他记录作为项目。请参见下面编辑的答案。你最了解输出,所以你可以编辑记录,索引到地图中,然后索引到记录中。我会提出另一个问题,因为这个例子已经有点太大了。通常,您可以根据需要索引到任意多个不同的类型。如果不想将输出限制为特定的记录类型,只需返回一个元组即可。您还可能索引到错误的记录,或者使用具有相同字段的记录(因此编译器无法区分它们)。但是您当然可以跳过
State2
,只返回原始数据(例如元组)。@JohnLaw如果您的示例有点太复杂,您可以使用
let stateall = statemap.Keys

let statedatamap =
 stateall
 |> Seq.map (fun state ->
    state,
    {State = state
     StateEdu = StateEdu.[state]
     StateFamily = StateFamily.[state]
     })
|> Map.ofSeq
type StateEdu = 
    { State : string
      Education : int
      Income : float }

type StateFamily =
    { State : string
      PctMoreThan4Children : float
      PctFamilyMorethan3 : float }

//I added this new type so this is value of the final map.    
type State2 = 
    { State : string
      StateEdu : StateEdu
      StateFamily : StateFamily }

//Instead providing the csv it's better to minimize the example, so here are the two record lists.      
let stateEdu = 
  [{State = "TX"; Income = 51522.; Education = 0}
   {State = "AL"; Income = 6481.; Education = 1}
   {State = "MO"; Income = 78921.; Education = 1}
   {State = "TN"; Income = 12000.; Education = 4}
   {State = "PA"; Income = 79850.; Education = 2}
   {State = "NY"; Income = 79215.; Education = 1}
   {State = "CA"; Income = 79045.; Education = 2}]

let datafamily = 
  [{State = "TX"; PctMoreThan4Children = 51.52; PctFamilyMorethan3 = 65.0}
   {State = "AL"; PctMoreThan4Children = 64.00; PctFamilyMorethan3 = 51.4}
   {State = "MO"; PctMoreThan4Children = 78.92; PctFamilyMorethan3 = 25.1}
   {State = "TN"; PctMoreThan4Children = 12.00; PctFamilyMorethan3 = 62.1}
   {State = "PA"; PctMoreThan4Children = 8.50; PctFamilyMorethan3 = 41.2}
   {State = "NY"; PctMoreThan4Children = 25.15; PctFamilyMorethan3 = 31.0}
   {State = "CA"; PctMoreThan4Children = 79.5; PctFamilyMorethan3 = 50.5}]


let stateedu =
     stateEdu
     |> Seq.map (fun x -> x.State,x)
     |> Map.ofSeq

let datafam =
     datafamily
     |> Seq.map (fun x -> x.State,x)
     |> Map.ofSeq

//This is one way to quickly extract the keys
let stateall = stateedu |> Map.toSeq |> Seq.map fst  

//We go through all the keys
let statedatamap =
 stateall
 |> Seq.map (fun state ->
    state,
    {State = state //this is the State2type
     StateEdu = stateedu.[state] 
     StateFamily = datafam.[state]
     })
|> Map.ofSeq