F#包含选项的数据类型

F#包含选项的数据类型,f#,F#,我是一名C#程序员,刚刚发现了F#编程的美妙之处(多亏了《域建模功能化》一书)。然而,我感到惊讶的是,我还没有找到一个常见场景的例子:用户有多个选项可以选择。例如,预订一个酒店房间,你可能想有几个额外的选择,如免费无线上网,过敏室,允许宠物,免费早餐,免费停车等。如何建模?我发现的所有示例都只有两个选项可供选择:opt1或opt2,或两者兼而有之。不过,这种解决方案无法扩展 我找到了一个,但我还需要一个更难的解决方案,其中选项可能有参数,如酒店房间预订示例:距离市中心的距离(用户可以提供一个值)

我是一名C#程序员,刚刚发现了F#编程的美妙之处(多亏了《域建模功能化》一书)。然而,我感到惊讶的是,我还没有找到一个常见场景的例子:用户有多个选项可以选择。例如,预订一个酒店房间,你可能想有几个额外的选择,如免费无线上网,过敏室,允许宠物,免费早餐,免费停车等。如何建模?我发现的所有示例都只有两个选项可供选择:opt1或opt2,或两者兼而有之。不过,这种解决方案无法扩展


我找到了一个,但我还需要一个更难的解决方案,其中选项可能有参数,如酒店房间预订示例:距离市中心的距离(用户可以提供一个值)、每晚最高奖金等。这些是用户可以选择的搜索选项,如果他愿意,但如果他选择,他必须为每个勾选的选项提供一个必需的参数。

鉴于您需要与不同选项关联的值,在您的情况下,我将只使用带有多个可选字段的记录

type Booking = 
    {
        freeWifi: unit option
        maxPricePerNight: decimal option
    }
    static member Empty =
       {
           freeWifi = None
           maxPricePerNight = None
       }
延长这一记录似乎是一件痛苦的事情,但我不认为在任何现实生活系统中都会出现这种情况。使用提供的空成员和单个记录字段上的模式匹配等功能,您永远不需要列出类型定义之外的所有字段

您可以在CLI选项解析器中看到解决此问题的更健壮的解决方案(使用DU和引号按大小写名称查找选项值),但对于您正在处理的场景来说,这是一种过火的解决方案