我正在尝试通过对this事件进行建模来练习自己的域建模。
将葡萄酒和上等面粉与 产品被称为伴随产品。仅面粉是 称为随餐供应。附带的用餐优惠 不需要挥手,带到[祭坛的角落],也不需要[提供] 与]乳香。它需要盐,并在外部燃烧 祭坛的全部。
把酒倒在坛上。它没有倒在火上。 相反,牧师应举起双手,将其倒在[ 坛的基础,然后从那里下降到shittin。
我试图通过表达我们正在处理的记录类型来简化:
type AlterLocations =
| Outer
| Corner
| Base
type AccompanyingOfferings =
| Wine
| Flour
type AccompanyingMealOfferings =
| FineFlour
type Auxilary =
| Salt
| Frankinsense
type Offering =
{
Name: string
}
但是,我无法为实际的事件建模:
type MealOffering =
{
Offering:Offering
Flour:AccompanyingMealOfferings
Waved: bool
RequiresSalt: bool
OfferedWithFrankinse: bool
ShouldBeBroughtToCorner: bool
EntirelyBurnt: bool
}
我们如何表示可能具有多个标签/标志的类型?
答案 0 :(得分:3)
您可以从Argu处理命令行参数的方式中浏览一个页面,然后执行以下操作:
type OfferingFlags =
| Waved
| RequiresSalt
| OfferedWithFrankincense
| ShouldBeBroughtToCorner
| EntirelyBurnt
然后MealOffering
类型看起来像这样:
type MealOffering =
{
Offering: Offering
Flour: AccompanyingMealOfferings
Flags: OfferingFlags list
}
列表中存在的标记 not 表示false
值,列表中存在的标记表示该标记的true
值。也就是说,要检查商品是否需要加盐,您可以这样做:
offering.Flags |> List.contains RequiresSalt
伴随提供餐食的清单(需要加盐,被完全烧掉,但不需要需要挥手,带到角落或用乳香提供)喜欢:
[ RequiresSalt; EntirelyBurnt ]
此建模方法的优点是,无论您拥有多少个标志,都可以添加新标志而无需编辑MealOffering
类型。这也可能是一个缺点,因为当您将每个标志分别建模为bool
时,每次添加新标志时,编译器都会迫使您到处考虑它-而通过将其建模为DU值列表,编译器不会强迫您在需要完成的地方检查新的RequiresSomethingElse
标志。但是,如果您认为已经完成添加新标志,或者在大多数情况下添加的任何新标志也应该默认为false
,那么OfferingFlags list
方法通常是个好方法。