如何从 F# 中的另一个受歧视联合初始化受歧视联合?
How to initialize a discriminated union from another discriminated union in F#?
有了下面的F#定义,模型如何初始化?
open System
open System.Windows
type ContactDetail = { Id: Guid; Name: string; Content: string; Text: string }
type Internet = { Id: Guid; Name: string; Content: string; Text: string }
type PhoneNumber = { Id: Guid; Name: string; Content: string; Text: string }
type Address = { Id: Guid; Name: string; Content: string; Text: string }
module Testing =
type Details =
| ContactDetail of ContactDetail
| Internet of Internet
| PhoneNumber of PhoneNumber
| Address of Address
let contactDetail : ContactDetail = {Id=Guid.NewGuid(); Name="Contact Detail"; Content="Content for Contact Detail"; Text="here is the contact detail text" }
let internet : Internet = {Id=Guid.NewGuid(); Name="Internet"; Content="Content for Internet"; Text="here is the internet text" }
let phoneNumber : PhoneNumber = {Id=Guid.NewGuid();Name="Phone Number"; Content="Content for phone number"; Text="here is the phone number text" }
let address : Address = {Id=Guid.NewGuid(); Name="Address"; Content="Content for Address"; Text="here is the Address text" }
let details = [ContactDetail contactDetail
Internet internet
PhoneNumber phoneNumber
Address address
]
type DetailsWithId = DetailsWithId of Details * Guid
type Model = {
ClickCount: int
Message: string
Details: DetailsWithId list
}
更具体地说,我需要模型的详细信息是一个列表(或序列)。由于类型 Details,类型 DetailsWithId 是否已经是一个列表?
TIA
如评论中所述,您的 Details
类型的值仅表示一个详细信息 - 列出的几个可能的详细信息之一。 Details list
类型的值是详细信息列表(可能为空,或者它可以包含相同详细信息类型的多个实例)。
如果这不是您所需要的,那么最好找到一个能够更好地捕捉您域结构的模型。
如果这是你想要的,那么我仍然会更改关于你的数据类型的两点:
首先,我会重新考虑您存储 ID 的方式。在您的模型中,您在个人记录中有 Id
字段,但又在 DetailsWithId
类型中。我想问题是如何自动将记录中的 ID 复制到 DetailsWithId
类型中的 ID。没有简单的方法可以做到这一点,但最好设计您的类型,这样您就不需要这样做。
其次,您的四种记录类型即ContactDetail
、Internet
等都是相同的。只使用一种类型不是更容易吗?
我认为如果您使用这样的类型定义,处理您的数据会容易得多(除非您的域中有您未在问题中记录的内容):
type DetailKind =
| ContactDetail
| Internet
| PhoneNumber
| Address
type Detail =
{ Id: Guid
Name: string
Content: string
Text: string
Kind: DetailKind }
type Details = Detail list
有了下面的F#定义,模型如何初始化?
open System
open System.Windows
type ContactDetail = { Id: Guid; Name: string; Content: string; Text: string }
type Internet = { Id: Guid; Name: string; Content: string; Text: string }
type PhoneNumber = { Id: Guid; Name: string; Content: string; Text: string }
type Address = { Id: Guid; Name: string; Content: string; Text: string }
module Testing =
type Details =
| ContactDetail of ContactDetail
| Internet of Internet
| PhoneNumber of PhoneNumber
| Address of Address
let contactDetail : ContactDetail = {Id=Guid.NewGuid(); Name="Contact Detail"; Content="Content for Contact Detail"; Text="here is the contact detail text" }
let internet : Internet = {Id=Guid.NewGuid(); Name="Internet"; Content="Content for Internet"; Text="here is the internet text" }
let phoneNumber : PhoneNumber = {Id=Guid.NewGuid();Name="Phone Number"; Content="Content for phone number"; Text="here is the phone number text" }
let address : Address = {Id=Guid.NewGuid(); Name="Address"; Content="Content for Address"; Text="here is the Address text" }
let details = [ContactDetail contactDetail
Internet internet
PhoneNumber phoneNumber
Address address
]
type DetailsWithId = DetailsWithId of Details * Guid
type Model = {
ClickCount: int
Message: string
Details: DetailsWithId list
}
更具体地说,我需要模型的详细信息是一个列表(或序列)。由于类型 Details,类型 DetailsWithId 是否已经是一个列表?
TIA
如评论中所述,您的 Details
类型的值仅表示一个详细信息 - 列出的几个可能的详细信息之一。 Details list
类型的值是详细信息列表(可能为空,或者它可以包含相同详细信息类型的多个实例)。
如果这不是您所需要的,那么最好找到一个能够更好地捕捉您域结构的模型。
如果这是你想要的,那么我仍然会更改关于你的数据类型的两点:
首先,我会重新考虑您存储 ID 的方式。在您的模型中,您在个人记录中有
Id
字段,但又在DetailsWithId
类型中。我想问题是如何自动将记录中的 ID 复制到DetailsWithId
类型中的 ID。没有简单的方法可以做到这一点,但最好设计您的类型,这样您就不需要这样做。其次,您的四种记录类型即
ContactDetail
、Internet
等都是相同的。只使用一种类型不是更容易吗?
我认为如果您使用这样的类型定义,处理您的数据会容易得多(除非您的域中有您未在问题中记录的内容):
type DetailKind =
| ContactDetail
| Internet
| PhoneNumber
| Address
type Detail =
{ Id: Guid
Name: string
Content: string
Text: string
Kind: DetailKind }
type Details = Detail list