functional-programming - 有没有一种方法可以检查 F# 中一个模式中的嵌套选项值?

标签 functional-programming f# pattern-matching monads

假设我们有以下类型:

type Message {
    text : Option<string>
}

type Update {
    msg : Option<Message> 
}

如何在一行中匹配它,就像在 C# 中使用 null 条件运算符,即 update?.msg?.text

有没有办法做到这一点?:

match msg, msg.text with 
| Some msg, Some txt -> ...
| None -> ...

因为我不想编写 2 个嵌套匹配表达式。

最佳答案

您有两种记录类型(示例中缺少“=”)。要匹配某些 Update 类型的变量,您可以执行以下操作:

type Message = { text : Option<string> }

type Update = { msg : Option<Message> }

let u = {msg = Some({text = Some "text"})}

//all 3 possible cases
match u with
| {msg = Some({text = Some t})} -> t
| {msg = Some({text = None})} -> ""
| {msg = None} -> ""

关于functional-programming - 有没有一种方法可以检查 F# 中一个模式中的嵌套选项值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62086547/

相关文章:

Javascript:标准化函数中的参数,我应该复制它吗?

ios - RxSwift 过滤器变量数组

f# - 如何避免多次迭代作为一种模式?

c# - 牛顿分形的 1/4 只画出来了

F# 对具有类型约束的泛型类进行模式匹配

Haskell:了解自定义数据类型

algorithm - 带有 K 钉的汉诺塔

javascript - 当为 fun 调用提供的 thisArg 值是 Function.prototype 对象时,fun.call 如何工作?

f# - 在 F# 中绘制图表并比较价格 - Chart.Combine 将不会生成图表

haskell - 如何简化这种模式匹配?