如何减少此F#代码中的重复模块?
我正在开发一个新系统,在这个系统中,我为我的实体使用强类型Id值。为了做到这一点,我遵循了我以前见过的推荐模式。虽然代码看起来很重复,但我想简化它如何减少此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
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)
谢谢现在看来这是个不错的方法。谢谢。目前看来这是一个不错的方法。