知道类型时,避免匹配区别联合

时间:2016-03-16 21:38:15

标签: f#

我的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}

我知道这一点 - 来自协议 - responseResponse.ChannelB,而且它的数据是ChannelBResponse.Data2。 即使我知道这一点,我仍然需要执行以下操作来获取实际的字符串值

let data = match msg.Response with
| Response.ChannelB x ->
    match x with
    | ChannelBResponse.Data2 y -> y

这是好的,因为协议保证匹配不会失败,但为所有可能的组合编写它会很麻烦。

是否有更轻松的方式来演员&#34;在这种情况下,msg.Response成为一个字符串?

1 个答案:

答案 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).