2

假设以下代码:

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"

“消息”是 System.Object 类型的地方,我可以做些什么来使模式匹配更好?例如一些通用的活动模式或一些这样的?

也许这个问题太短了,但我只是想看看是否有办法使上述语法更好

4

2 回答 2

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 ...
于 2014-01-27T06:32:47.780 回答
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) =
于 2014-01-27T06:40:21.597 回答