f#模式匹配c#类

Pet*_*ter 4 .net c# f# pattern-matching

我有一个C#模块接收和处理Operation类的各种实例.接口声明了一个方法:

Operation Transform(Operation o1, Operation o2);
Run Code Online (Sandbox Code Playgroud)

但是有几种操作.例如,对于简单的文本编辑,有InsertOperation和DeleteOperation,因此Transform方法的主体首先排序它接收的操作类型并将其转换.在学习了一些F#后,我想在其中重写项目的这一部分(作为练习和实验)并且认为我可以通过这样的模式匹配来更好地处理这个:

let Transform (oa: Operation) (ob: Operation) = 
    match oa, ob with 
    | InsertOperation o1, InsertOperation o2 -> //transformation
    | DeleteOperation o1, InsertOperation o2 -> //transformation
    | InsertOperation o1, DeleteOperation o2 -> //transformation
    | DeleteOperation o1, DeleteOperation o2 -> //transformation
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误消息:

The pattern discriminator 'InsertOperation' is not defined
Run Code Online (Sandbox Code Playgroud)

Operation类及其后代是用C#编写的,但我认为这不应该成为问题.有人可以解释为什么这是一个问题,我怎么能解决这个问题?

Ree*_*sey 7

由于这不是一个有区别的联合,而只是一组类(用C#编写),你需要使用一个类型测试模式:

let Transform (oa: Operation) (ob: Operation) = 
    match oa, ob with 
    | (:? InsertOperation as o1), (:? InsertOperation as o2) -> //transformation
    | (:? DeleteOperation as o1), (:? InsertOperation as o2) -> //transformation
    | (:? InsertOperation as o1), (:? DeleteOperation as o2) -> //transformation
    | (:? DeleteOperation as o1), (:? DeleteOperation as o2) -> //transformation
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅模式匹配中的类型测试模式.