解开单个案例工会

时间:2018-08-11 19:35:08

标签: f#

我有一段漂亮的F#代码,将Pizza映射到PizzaModel:

type Cheese = Cheese of string

type Pizza 
{
    Name: string
    Cheese: Cheese
}

type PizzaModel =
{
    PizzaName : string
    Cheese: string
    Toppings: string
}

let mapPizza pizza = 
    let (Cheese c) = pizza.Cheese
    { PizzaName = pizza.Name; Cheese = c}

是否可以写出不同的文字,我可以将奶酪解开包装吗?

1 个答案:

答案 0 :(得分:3)

我花了一些时间弄清楚您的类型定义可能是什么。我让您的代码可以与以下代码一起编译,所以我假设这就是您的代码:

type Cheese = Cheese of bool
type CheesePizza = { PizzaName : string; Cheese : bool }
type Pizza = { Name : string; Cheese : Cheese}

我认为无法在函数的最后一行解开内联的奶酪,但是您可以在第一行的模式中解开名称和奶酪:

let mapPizza { Cheese = Cheese c; Name = name } = 
    { PizzaName = name; Cheese = c}

此模式与参数匹配,并使用嵌套模式提取奶酪。

编辑,另一种方法是修改Cheese类型并添加一个使您可以轻松访问包装值的成员。这很容易做到:

type Cheese = 
    | Cheese of string
    member x.Value = let (Cheese v) = x in v

现在,您可以使用pizza.Cheese.Value内联解包值:

let mapPizza pizza = 
    { PizzaName = pizza.Name; Cheese = pizza.Cheese.Value }
相关问题