首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拆开单个案例的“就位”

拆开单个案例的“就位”
EN

Stack Overflow用户
提问于 2018-08-11 19:35:07
回答 1查看 318关注 0票数 2

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

代码语言:javascript
复制
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}

有可能写这种不同的,我能打开奶酪的地方吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-11 20:09:20

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

代码语言:javascript
复制
type Cheese = Cheese of bool
type CheesePizza = { PizzaName : string; Cheese : bool }
type Pizza = { Name : string; Cheese : Cheese}

我不认为有一种方法可以在函数的最后一行内联地展开奶酪,但是您可以在第一行的模式中将名称和奶酪都展开:

代码语言:javascript
复制
let mapPizza { Cheese = Cheese c; Name = name } = 
    { PizzaName = name; Cheese = c}

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

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

代码语言:javascript
复制
type Cheese = 
    | Cheese of string
    member x.Value = let (Cheese v) = x in v

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

代码语言:javascript
复制
let mapPizza pizza = 
    { PizzaName = pizza.Name; Cheese = pizza.Cheese.Value }
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51803099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档