相关疑难解决方法(0)

何时在F#中使用判别联盟vs记录类型

在尝试复杂的例子之前,我试图弄清楚F#的基础知识.我正在学习的材料引入了Discriminate Unions和Record类型.我已经审查了两者的材料,但我仍然不清楚为什么我们会使用一个而不是另一个.

我创建的大多数玩具示例似乎都可以在两者中实现.记录似乎与我认为的C#中的对象非常接近,但我试图避免依赖映射到c#作为理解F#的方法

所以...

  • 是否有明确的理由使用一个而不是另一个?

  • 是否存在适用的某些规范案例?

  • 是否有某些功能可用于一个,而不是另一个?

f# record discriminated-union

22
推荐指数
3
解决办法
3563
查看次数

可重复的模式匹配

请考虑以下简单示例.

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,定义两个操作:

PrintInstrumentNamePrintRequisites

然后实现类 - 每个支付工具一个.要根据某些外部条件实例化仪器,我会使用(例如)工厂模式(PaymentInstrumentFactory).

如果我需要添加一个新的支付工具,我只需要添加一个实现IPaymentInstrument接口和更新工厂实例化逻辑的新类.使用这些类的其他代码保持不变.

但是如果我使用函数方法,我应该更新这种类型的模式匹配存在的每个函数.

如果有很多函数使用PaymentInstrument类型将是一个问题.

如何使用功能方法消除这个问题?

f# functional-programming

8
推荐指数
2
解决办法
566
查看次数