有没有一种方法可以在F#中以一种模式检查嵌套选项值?

时间:2020-05-29 12:55:32

标签: functional-programming f# pattern-matching monads

假装我们具有以下类型:

type Message {
    text : Option<string>
}

type Update {
    msg : Option<Message> 
}

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

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

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

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

1 个答案:

答案 0 :(得分:3)

您有两种记录类型(在示例中缺少“ =”)。要匹配某些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} -> ""