在尝试复杂的例子之前,我试图弄清楚F#的基础知识.我正在学习的材料引入了Discriminate Unions和Record类型.我已经审查了两者的材料,但我仍然不清楚为什么我们会使用一个而不是另一个.
我创建的大多数玩具示例似乎都可以在两者中实现.记录似乎与我认为的C#中的对象非常接近,但我试图避免依赖映射到c#作为理解F#的方法
所以...
是否有明确的理由使用一个而不是另一个?
是否存在适用的某些规范案例?
是否有某些功能可用于一个,而不是另一个?
请考虑以下简单示例.
type PaymentInstrument =
| Check of string
| CreditCard of string * DateTime
let printInstrumentName instrument =
match instrument with
| Check number-> printfn "check"
| CreditCard (number, expirationDate) -> printfn "card"
let printRequisites instrument =
match instrument with
| Check number -> printfn "check %s" number
| CreditCard (number, expirationDate) -> printfn "card %s %A" number expirationDate
Run Code Online (Sandbox Code Playgroud)
如您所见,在两个函数中重复相同的模式匹配逻辑.如果我要使用OOP,我会创建接口IPaymentInstrument,定义两个操作:
PrintInstrumentName 和 PrintRequisites
然后实现类 - 每个支付工具一个.要根据某些外部条件实例化仪器,我会使用(例如)工厂模式(PaymentInstrumentFactory).
如果我需要添加一个新的支付工具,我只需要添加一个实现IPaymentInstrument接口和更新工厂实例化逻辑的新类.使用这些类的其他代码保持不变.
但是如果我使用函数方法,我应该更新这种类型的模式匹配存在的每个函数.
如果有很多函数使用PaymentInstrument类型将是一个问题.
如何使用功能方法消除这个问题?