Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
模式匹配中的F#惯用类型转换?_F#_Pattern Matching_Discriminated Union - Fatal编程技术网

模式匹配中的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,我偶尔会遇到这样的限制:不允许活动模式具有仅出现在返回类型中的类型变量。