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

时间:2014-07-06 15:10:20

标签: f# functional-programming

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

我正在尝试使用F#学习函数式编程,所以我想在" functional"没有使用天真的开关式模式匹配和可变字段的方式(这是我想使用记录类型的方式)

我的记录类型:

type Entity = {
    Numbers: int[]
    Date: DateTime
    Name: string
}

代表单个细分的联盟:

type EntitySegment =
    | Date of DateTime
    | Name of string
    | Number of int

我想做以下事情:

// 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

和myRecord将是:

val myRecord : Entity = {Numbers = [|5; 8; 3; 42|]; Date = 2014-07-06 17:02:36; Name = "Foobar";}

1 个答案:

答案 0 :(得分: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 })

通过使用更多惯用类型,我已将Entity更改为“更多”功能“:

type Entity = {
    Numbers: int list
    Date: DateTime
    Name: string
}