F#中泛型类型的泛型函数

时间:2019-01-29 18:02:48

标签: functional-programming f#

我正在学习使用F#进行函数式编程,我想编写一个函数以提高数字的功效。我以以下方式编写它:

let raiseToPower a power = 
    let folding x _ = x * a
    [1..power-1] |> List.fold folding a

let result = raiseToPower 2 5

我没有指定输入变量a的类型,因此我可以将此函数与浮点数或整数一起使用-但不能同时使用两者

let result = raiseToPower 2.3 5 // OK

// separate program let result = raiseToPower 2 5 // OK

// separate program let result1 = raiseToPower 2.3 5 // OK let result2 = raiseToPower 2 5 // fail

第一个问题是:     是否有使其通用的方法?


之所以为F#的函数提供函数已经内置的实现,是因为我想对自定义类型使用类似的东西-例如Complex Numbers。

请考虑以下内容:

type ComplexNumber = {re: double; im: double;}

let (@*) cn1 cn2 = 
    {re = cn1.re * cn2.re - cn1.im * cn2.im; im = cn1.re * cn2.im + cn1.im * cn2.re}

我有一个新的类型ComplexNumber和一个新的运算符,它可以将两个复数相乘。现在,我可以编写一个类似的函数来提高ComplexNumber的功率:

let raiseCnToPower a power = 
    let folding x _ = x @* a
    [1..power-1] |> List.fold folding a

第二个问题是:     有没有一种方法可以使初始函数与自定义类型和自定义运算符一起使用?


结论性问题:     我想知道您应该在函数编程方面做什么。这是否被认为是一个问题,或者针对不同类型的不同功能执行几乎相同的操作就可以了?有没有一种方法可以从功能编程和F#方面专门改善解决方案?

1 个答案:

答案 0 :(得分:4)

一种简单的方法是将其声明为inline

let inline raiseToPower a power = 
    let folding x _ = x * a
    [1..power] |> List.fold folding (a / a) // <- handles power = 0

let result1 = raiseToPower 2 5
let result2 = raiseToPower 2. 5