问题描述
使用以下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