2014-01-27 82 views
2

假設下面的代碼: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類型 的是有什麼我可以爲了使模式匹配更好嗎? 例如一些通用的活動模式或一些這樣的?

也許這個問題太短暫,但我只是想看看是否有一種方法,使上述語法更好

回答

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 ... 
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) = 
+0

是啊,我偶爾會打這個限制:不允許用於有源圖案有隻出現在返回類型的類型變量。 – Tarmil