我的PC上连接了一些硬件。硬件由两个组件组成,每个组件都能够从周围环境中读取一些东西(例如温度)。
我使用协议与硬件通信,我在F#中实现了该协议,我有这个(简化)模型:
我可以向硬件查询每个子组件的值/读数,每个子组件都有不同的值,我可以用不同的类型查询。
type ChannelAResponse =
| Data1 of float
| Data2 of string
type ChannelBResponse =
| Data1 of int
| Data2 of string
type Response =
| ChannelA of ChannelAResponse
| ChannelB of ChannelBResponse
type ResponseMessage =
{ Id : int
Response : Response }
// The `msg` is actually constructed from the data sent from the hardware
// where this `msg` is just an example.
let response = Response.ChannelB <| ChannelBResponse.Data2 "Everything ok"
let msg = {Id=10; Response=response}
我知道这一点 - 来自协议 - response
是Response.ChannelB
,而且它的数据是ChannelBResponse.Data2
。
即使我知道这一点,我仍然需要执行以下操作来获取实际的字符串值
let data = match msg.Response with
| Response.ChannelB x ->
match x with
| ChannelBResponse.Data2 y -> y
这是好的,因为协议保证匹配不会失败,但为所有可能的组合编写它会很麻烦。
是否有更轻松的方式来演员&#34;在这种情况下,msg.Response
成为一个字符串?
答案 0 :(得分:1)
这相当于您的不完整模式匹配,但更短
let (ChannelB(Data2 data)) = msg.Response
// val data : string = "Everything ok"
warning FS0025: Incomplete pattern matches on this expression. For example, the value 'ChannelA (_)' may indicate a case not covered by the pattern(s).