怎么做**在F#模块功能结构中覆盖**? (或类似的影响)

时间:2018-01-24 03:54:24

标签: f#

让我说我有这些代码 -

let plus a b=Seq.init a (fun _->1)|>Seq.fold(+)b
let multiply a b=Seq.init a (fun _->b)|>Seq.fold plus 0
let power a b=Seq.init b (fun _->a)|>Seq.fold multiply 1

如果以后我想要另外一种方法怎么做 -

let shortPlus=(+)

好吧,我考虑了一些解决方案......

第一个是复制整个代码,但如果代码真的很大怎么办?

let shortPlus=(+)
let multiply a b=Seq.init a (fun _->b)|>Seq.fold shortPlus 0
let power a b=Seq.init b (fun _->a)|>Seq.fold multiply 1

第二个是将plus函数作为参数发送,稍后可自定义 -

let customizablePlus f a b=f a b
let customizableMultiply plus a b=customizablePlus plus|>fun plus->Seq.init a (fun _->b)|>Seq.fold plus 0
let customizablePower plus a b=customizableMultiply plus|>fun multiply->Seq.init b (fun _->a)|>Seq.fold multiply 1
let shortPlus=(+)
let power2=customizablePower shortPlus

但是 - 为什么Power需要注意如何做多加?为什么呼唤电源需要告诉它如何做加号?这很不自然!

第三个猜测是 - 使用添加代码文件作为VisualStudio的快捷功能 - 我稍后会尝试。

1 个答案:

答案 0 :(得分:2)

你不能像C#中的方法一样覆盖函数。但是你的power函数在第一个版本中并不依赖于plus,因此你不需要传递它,它只需要乘法函数。

let plus1 = (+)
let plus2 a b = plus1 a b |> (+) 1
let customizableMultiply plus a b = Seq.init a (fun _-> b)|>Seq.fold plus 0
let customizablePower multiply a b= Seq.init b (fun _->a)|>Seq.fold multiply 1
let mult1 = customizableMultiply plus1
let mult2 = customizableMultiply plus2
let power1=customizablePower mult1 2 3 //=8
let power2=customizablePower mult2 2 3 //=27