如何从F#中的另一个已区分联盟初始化一个已区分联盟?

时间:2020-08-23 04:52:05

标签: f# discriminated-union

使用以下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

1 个答案:

答案 0 :(得分:2)

如评论中所述,您的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
相关问题