Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何减少此F#代码中的重复模块?_F#_Discriminated Union - Fatal编程技术网

如何减少此F#代码中的重复模块?

如何减少此F#代码中的重复模块?,f#,discriminated-union,F#,Discriminated Union,我正在开发一个新系统,在这个系统中,我为我的实体使用强类型Id值。为了做到这一点,我遵循了我以前见过的推荐模式。虽然代码看起来很重复,但我想简化它 type PersonId=字符串的私有PersonId 模块PersonId= 让private prefix=“person” let值(PersonId id)=id 让我们创建(id:string)=PersonId(sprintf“%s\u%s”前缀id) 类型OrderId=字符串的私有OrderId 模块医嘱ID= 让private p

我正在开发一个新系统,在这个系统中,我为我的实体使用强类型Id值。为了做到这一点,我遵循了我以前见过的推荐模式。虽然代码看起来很重复,但我想简化它

type PersonId=字符串的私有PersonId
模块PersonId=
让private prefix=“person”
let值(PersonId id)=id
让我们创建(id:string)=PersonId(sprintf“%s\u%s”前缀id)
类型OrderId=字符串的私有OrderId
模块医嘱ID=
让private prefix=“order”
let值(OrderId)=id
让我们创建(id:string)=OrderId(sprintf“%s\u%s”前缀id)

有没有办法让这个代码更通用,这样我就不必重复模块代码了?我正在考虑将
PersonId
OrderId
类型建立一个
EntityId
区分联合,但不确定
EntityId
模块代码可能是什么样子。谢谢你的帮助。

我想你正朝着这样的方向前进:

type EntityId =
    private
    | PersonId of string
    | OrderId of string

module EntityId =
    let init makeEntity prefix =
        fun id -> makeEntity (sprintf "%s_%s" prefix id)
    let value = function
        | PersonId id
        | OrderId id -> id
module PersonId =
    let create = EntityId.init PersonId "person"

module OrderId =
    let create = EntityId.init OrderId "order"
let personId = PersonId.create "abc"
let orderId = OrderId.create "xyz"

printfn "%A" personId
printfn "%A" orderId

printfn "%s" <| EntityId.value personId
printfn "%s" <| EntityId.value orderId
这里的技巧是使用
init
函数来创建当前的
函数,如下所示:

type EntityId =
    private
    | PersonId of string
    | OrderId of string

module EntityId =
    let init makeEntity prefix =
        fun id -> makeEntity (sprintf "%s_%s" prefix id)
    let value = function
        | PersonId id
        | OrderId id -> id
module PersonId =
    let create = EntityId.init PersonId "person"

module OrderId =
    let create = EntityId.init OrderId "order"
let personId = PersonId.create "abc"
let orderId = OrderId.create "xyz"

printfn "%A" personId
printfn "%A" orderId

printfn "%s" <| EntityId.value personId
printfn "%s" <| EntityId.value orderId
然后你可以这样使用它:

type EntityId =
    private
    | PersonId of string
    | OrderId of string

module EntityId =
    let init makeEntity prefix =
        fun id -> makeEntity (sprintf "%s_%s" prefix id)
    let value = function
        | PersonId id
        | OrderId id -> id
module PersonId =
    let create = EntityId.init PersonId "person"

module OrderId =
    let create = EntityId.init OrderId "order"
let personId = PersonId.create "abc"
let orderId = OrderId.create "xyz"

printfn "%A" personId
printfn "%A" orderId

printfn "%s" <| EntityId.value personId
printfn "%s" <| EntityId.value orderId
另外,如果您喜欢咖喱,您可以将
init
简化为:

let init makeEntity prefix id =
    makeEntity (sprintf "%s_%s" prefix id)

我想你正朝着这样的方向前进:

type EntityId =
    private
    | PersonId of string
    | OrderId of string

module EntityId =
    let init makeEntity prefix =
        fun id -> makeEntity (sprintf "%s_%s" prefix id)
    let value = function
        | PersonId id
        | OrderId id -> id
module PersonId =
    let create = EntityId.init PersonId "person"

module OrderId =
    let create = EntityId.init OrderId "order"
let personId = PersonId.create "abc"
let orderId = OrderId.create "xyz"

printfn "%A" personId
printfn "%A" orderId

printfn "%s" <| EntityId.value personId
printfn "%s" <| EntityId.value orderId
这里的技巧是使用
init
函数来创建当前的
函数,如下所示:

type EntityId =
    private
    | PersonId of string
    | OrderId of string

module EntityId =
    let init makeEntity prefix =
        fun id -> makeEntity (sprintf "%s_%s" prefix id)
    let value = function
        | PersonId id
        | OrderId id -> id
module PersonId =
    let create = EntityId.init PersonId "person"

module OrderId =
    let create = EntityId.init OrderId "order"
let personId = PersonId.create "abc"
let orderId = OrderId.create "xyz"

printfn "%A" personId
printfn "%A" orderId

printfn "%s" <| EntityId.value personId
printfn "%s" <| EntityId.value orderId
然后你可以这样使用它:

type EntityId =
    private
    | PersonId of string
    | OrderId of string

module EntityId =
    let init makeEntity prefix =
        fun id -> makeEntity (sprintf "%s_%s" prefix id)
    let value = function
        | PersonId id
        | OrderId id -> id
module PersonId =
    let create = EntityId.init PersonId "person"

module OrderId =
    let create = EntityId.init OrderId "order"
let personId = PersonId.create "abc"
let orderId = OrderId.create "xyz"

printfn "%A" personId
printfn "%A" orderId

printfn "%s" <| EntityId.value personId
printfn "%s" <| EntityId.value orderId
另外,如果您喜欢咖喱,您可以将
init
简化为:

let init makeEntity prefix id =
    makeEntity (sprintf "%s_%s" prefix id)

谢谢现在看来这是个不错的方法。谢谢。目前看来这是一个不错的方法。