F# 处理记录

F# 处理记录,f#,F#,我需要从记录中提取状态的字符串版本。代码如下: type State = State of string type Data = { State : State Year : int Income : float } 我需要做的是提取每个状态的字符串版本序列,而不是状态“string”。当我尝试做下面这样的事情时,我得到一个空序列。我在运行处理数据并将其映射到上述记录的代码之后运行下面的代码 let states (row:Data) = row.State //

我需要从记录中提取状态的字符串版本。代码如下:

type State = State of string

type Data = 
   { State : State
     Year : int
     Income : float }
我需要做的是提取每个状态的字符串版本序列,而不是状态“string”。当我尝试做下面这样的事情时,我得到一个空序列。我在运行处理数据并将其映射到上述记录的代码之后运行下面的代码

let states (row:Data) = row.State
// <fun:it@145-1> val it : unit = ()
将数据映射到以下记录后,再次执行此操作:

let statepa () =
  Stat.GetSample().Rows
  |> Seq.map(fun row ->  
    { State = row.STATE 
      Year  = row.Year })
通常,您可以使用模式匹配“展开”单个区分大小写的并集(如
状态
类型):

let ma = State "MA"
let (State str) = ma
printfn "%s" str   // prints "MA"
或者,您可以将模式放入函数的参数中:

let stateToStr (State s) = s
printfn "%s" (stateToStr ma)   // prints "MA"
或者,如果在
状态
函数中只需执行一次,则可以将
状态
模式嵌套在
数据
模式中:

let states { State = State s } = s

let row = { State = State "MA"; Year = 1; Income = 2. }
printfn "%s" (states row)   // Prints "MA"
模式可以嵌套,这是它们的强大功能。

这个特定的模式由两个嵌套模式组成:模式
{State=x}
x
绑定到传入记录的字段
State
的值,模式
状态s
s
绑定到
状态的“内部值”

我真的不能说什么,因为我不知道什么是
stateCV
。还有,你为什么要打印一个函数?然后,作为一个单独的问题,@FyodorSoikin已经回答了当前关于“处理记录”的问题。当你说“我得到一个空序列”时,你是指你显示的输出中的
()
?因为
()
不是空序列
()
是一个称为“unit”的特殊值,它是由没有任何有意义的返回值的函数返回的值(如
printfn
,它只将内容打印到屏幕上,不返回任何内容)。阅读更多关于它的信息或(注意,第一个链接是关于Elm的问题,但是F#的
unit
与Elm的
unit
)是一样的。另外,当您执行
printfn“%a”statec
时,您希望它做什么?因为它实际上要做的是打印函数本身,这很少有用。我认为您想做的是
printfn“%A”(statec someRow)
,它会将一行数据作为输入传递给函数,并打印函数的结果。
let states { State = State s } = s

let row = { State = State "MA"; Year = 1; Income = 2. }
printfn "%s" (states row)   // Prints "MA"