F#惯用模型匹配?

时间:2014-01-27 05:44:24

标签: f# pattern-matching discriminated-union

假设以下代码:

override x.OnReceive message =
    match message with
    | :? SomeActorMessages as m ->  
        match m with
        | Greet(name) -> Console.WriteLine("Hello {0}",name)
        | Hi -> Console.WriteLine("Hello from F#!")
    | _ -> failwith "unknown message"

其中“message”的类型为System.Object 有什么我可以做的,以使模式匹配更好? 例如一些通用的活动模式还是一些这样的?

也许这个问题太短了但我只是想看看是否有办法让上面的语法更好

2 个答案:

答案 0 :(得分:3)

你需要一个单独的函数来强制类型。

let someActorMessages message =
    match box message with
    | :? SomeActorMessages as m -> m
    | _ -> failwith "unknown message"

override x.OnReceive message =
    match someActorMessages message with ...

该功能也可以写成单个案例活动模式。

let (|SomeActorMessages|) message =
    ...

override x.OnReceive (SomeActorMessages message) =
    match message with ...

答案 1 :(得分:2)

这是一个活跃的模式解决方案:

let (|Type|_|) (dummy:'t) (x:obj)=
    match x with
    | :? ('t) as t -> Some(t)
    | _ -> None

不幸的是,它需要一个虚拟变量才能使模式具有通用性 - 我无法想到解决这个问题的方法。

这两个都不起作用

let (|Type|_|)  (x:obj) : 't option=
let (|Type<'t>|_|)  (x:obj) =