让我说我有这些代码 -
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的快捷功能 - 我稍后会尝试。
答案 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