2014-01-27 3 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

Смежные вопросы