我有以下代码:
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 )
??
最佳答案
F# 区分联合非常接近于 OO 类层次结构,因此这可能是最佳选择。最显着的区别是您不能在不修改类型声明的情况下将新案例添加到可区分的联合中。另一方面,您可以轻松添加适用于该类型的新函数(这大致对应于在 C# 中添加新的虚拟方法)。
因此,如果您不希望添加新的继承类(案例),那么这是最佳选择。否则,您可以使用 F# 对象类型(或其他选项,具体取决于场景)。
还有一点关于您的代码 - 由于您无法添加新案例,F# 编译器知道您需要的唯一案例是 B
和 C
。因此,block_3
永远不会被执行,这意味着您可以只写:
let my_fct x =
match x with
| B -> ( block_1 )
| C -> ( block_2 )
关于c# - F# 区分联合与 C# 类层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7334019/