处理记录

时间:2018-06-17 03:08:32

标签: f#

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

type State = State of string

type Data = 
   { State : State
     Year : int
     Income : float }

我需要做的是提取每个州的字符串版本的序列,而不是State" string"。当我尝试做下面的事情时,我得到一个空序列。我运行代码后运行下面的代码,该代码处理并将数据映射到上述记录。

let states (row:Data) = row.State
// <fun:it@145-1> val it : unit = ()

我需要一个序列,因为最后我将使用它来检查并确保一个数据集中的状态是另一个数据集中的状态。

编辑:

在做了类似下面的事情之后,我仍然得到空序列。

let stateToStr (State s) = s
let statec (row:StateCsv) = (stateToStr row.State)
printfn "%A" statec
// val stateToStr : State -> string
// val statec : row:StateCsv -> string
// val it : unit = ()

将数据写入像这样的记录之后再次:

let statepa () =
  Stat.GetSample().Rows
  |> Seq.map(fun row ->  
    { State = row.STATE 
      Year  = row.Year })

1 个答案:

答案 0 :(得分:4)

一般来说,你可以打开&#34;打开&#34;带有模式匹配的单例区分联合(如{'id': 427, 'name': 'Bugbear Entertainment', 'type': 'developer'} 类型):

State

或者,您可以将模式放在函数的参数中:

let ma = State "MA"
let (State str) = ma
printfn "%s" str   // prints "MA"

或者,如果您只需要在let stateToStr (State s) = s printfn "%s" (stateToStr ma) // prints "MA" 函数中执行此操作,则可以将states模式嵌套在State模式中:

Data

模式可以嵌套,这是它们的强大力量 这个特定的模式由两个嵌套模式组成:模式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绑定State s到&#34;内在价值&#34; s