【发布时间】:2011-11-12 03:18:25
【问题描述】:
我有以下代码:
public abstract class A ...
public class B : A ...
public class C : A ...
void my_fct(A x) {
if (x is B) { block_1 }
else if (x is C) { block_2 }
else { block_3 }
}
我想知道它是否是来自 F# 的好翻译
type a = B | C
let my_fct x =
match x with
| B -> ( block_1 )
| C -> ( block_2 )
| _ -> ( block_3 )
??
【问题讨论】:
-
我想没关系。除了你不见了;在block_1、block_2和block_3之后
-
请原谅我的无知,但似乎
block_3永远无法在 F# sn-p 中执行(据我所知,代数数据类型是“封闭的”),所以为什么会出现?另外,我是唯一一个认为翻译应该使用多态性的人吗? -
关于 block_3,你们完全正确。
-
F# 模式匹配编译为程序集的跳转,因此联合案例的数量为 O(1)。为了在 C# 中匹配性能,您应该有一个 int 或 enum 编码案例编号,并将模式匹配编码为 switch 语句。
标签: c# f# class-hierarchy c#-to-f# discriminated-union