模式匹配中的F#惯用类型转换?
假设以下代码:模式匹配中的F#惯用类型转换?,f#,pattern-matching,discriminated-union,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#!") | _
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
为了使模式匹配更好,我能做些什么吗?
e、 g.一些通用的活动模式或类似模式
也许这个问题太短了,但我只是想看看是否有办法使上面的语法更好对于类型强制,您需要一个单独的函数
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 ...
以下是一个活动模式解决方案:
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) =
let(| Type | | |)(x:obj):'t选项=
let(| TypeYeah,我偶尔会遇到这样的限制:不允许活动模式具有仅出现在返回类型中的类型变量。