我试图通过尝试建模这事件来实践我的域建模。
酒和细面,并同献的供物,称为同献的祭物。仅细面粉就被称为伴随的素祭.所附的素祭,不必摆在坛的角上,也不可用乳香献上。它需要盐,它被烧在外面的祭坛上。 酒倒在祭坛上。它不是倒在火上的。祭司却要举起手,倒在坛的基座上,从那里下到屎桶。
我试图通过表达我们正在处理的记录类型来简化:
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
}如何表示可能有多个标记/标志的类型?
发布于 2019-01-15 21:43:56
您可以从阿古处理命令行参数的方式中获取一个页面,并执行如下操作:
type OfferingFlags =
| Waved
| RequiresSalt
| OfferedWithFrankincense
| ShouldBeBroughtToCorner
| EntirelyBurnt然后,MealOffering类型可能如下所示:
type MealOffering =
{
Offering: Offering
Flour: AccompanyingMealOfferings
Flags: OfferingFlags list
}列表中不存在的标志表示false值,列表中的标志表示该标志的true值。也就是说,为了检查祭品是否需要盐,你应该这样做:
offering.Flags |> List.contains RequiresSalt与之配套的供餐单(需要盐、完全烧焦,但不需要招手、带到角落或提供乳香),看上去如下:
[ RequiresSalt; EntirelyBurnt ]这种建模方法的优点是,无论您有多少标志,您都可以添加一个新标志,而不必编辑MealOffering类型。这也可能是一个缺点,因为当您将每个标志分别建模为一个bool时,每当您添加一个新标志时,编译器都会强迫您在任何地方都考虑它--而通过将其建模为一个DU值列表,编译器不会强迫您在需要检查的地方检查新的RequiresSomethingElse标志。但是,如果您认为您已经完成了添加新标志,或者您添加的任何新标志在大多数地方也应该默认为false,那么OfferingFlags list方法通常是一个很好的方法。
https://stackoverflow.com/questions/54206931
复制相似问题