假设以下代码:
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 有什么我可以做的,以使模式匹配更好? 例如一些通用的活动模式还是一些这样的?
也许这个问题太短了但我只是想看看是否有办法让上面的语法更好
答案 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) =