似乎F#代码经常针对类型进行模式匹配。当然
match opt with
| Some val -> Something(val)
| None -> Different()
似乎很常见。
但是从OOP的角度来看,这看起来非常像基于运行时类型检查的控制流,通常会对此皱眉。要说明,在OOP中,您可能更喜欢使用重载:
type T =
abstract member Route : unit -> unit
type Foo() =
interface T with
member this.Route() = printfn "Go left"
type Bar() =
interface T with
member this.Route() = printfn "Go right"
这肯定是更多代码。OTOH,在我的OOP-y看来,它具有结构上的优势:
- 扩展到新形式
T
很容易; - 我不必担心会发现路径选择控制流程的重复。和
- 从某种意义上说,路线选择是一成不变的,我一经
Foo
掌握就不必担心Bar.Route()
的实现
模式匹配与我没有看到的类型有优势吗?它是惯用语言还是不常用的功能?
But from an OOP perspective, that looks an awful lot like control-flow based on a runtime type check, which would typically be frowned on.
听起来太教条了。有时,您想将自己的操作与层次结构分开:也许1)您不能将操作添加到不属于该层次结构的b / c中;2)您想要拥有的操作的类与您的层次结构不匹配;3)您可以将op添加到您的层次结构中,但不希望您不想因为大多数客户不使用的一堆废话而混乱您的层次结构的API。