以功能方式从段创建F#记录

Mac*_*iak 3 f# functional-programming

从表示此记录段的区别联合实例列表中创建记录实例的最佳方法是什么.

我正在尝试使用F#学习函数式编程,所以我想以"功能"方式进行,而不使用类似于开关的模式匹配和可变字段(这是我想要使用记录类型的方式)

我的记录类型:

type Entity = {
    Numbers: int[]
    Date: DateTime
    Name: string
}
Run Code Online (Sandbox Code Playgroud)

代表单个细分的联盟:

type EntitySegment =
    | Date of DateTime
    | Name of string
    | Number of int
Run Code Online (Sandbox Code Playgroud)

我想做以下事情:

// segments could be in arbitrary order
let segments = [ Number 5; Name "Foobar"; Number 8; Number 3; Date System.DateTime.Now; Number 42 ];;
let myRecord = createEntity segments
Run Code Online (Sandbox Code Playgroud)

和myRecord将是:

val myRecord : Entity = {Numbers = [|5; 8; 3; 42|]; Date = 2014-07-06 17:02:36; Name = "Foobar";}
Run Code Online (Sandbox Code Playgroud)

小智 7

一些直截了当的方法(由于不变性导致的大量分配):

let createEntity segments =
    ({ Numbers = []; Date = DateTime.MinValue; Name = ""}, segments)
    ||> List.fold (fun entity segment ->
        match segment with
        | Date date -> { entity with Entity.Date = date }
        | Name name -> { entity with Name = name }
        | Number num -> { entity with Numbers = num :: entity.Numbers })
Run Code Online (Sandbox Code Playgroud)

Entity通过使用一些更惯用的类型,我已经改为"更多"功能性'':

type Entity = {
    Numbers: int list
    Date: DateTime
    Name: string
}
Run Code Online (Sandbox Code Playgroud)