如何从 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。没有简单的方法可以做到这一点,但最好设计您的类型,这样您就不需要这样做。

  • 其次,您的四种记录类型即ContactDetailInternet等都是相同的。只使用一种类型不是更容易吗?

我认为如果您使用这样的类型定义,处理您的数据会容易得多(除非您的域中有您未在问题中记录的内容):

type DetailKind =
    | ContactDetail 
    | Internet
    | PhoneNumber
    | Address

type Detail =
  { Id: Guid
    Name: string
    Content: string
    Text: string 
    Kind: DetailKind }

type Details = Detail list