首页 > 解决方案 > 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# 已经有内置实现的东西创建函数的原因是我想使用类似的东西和自定义类型 - 例如,复数。

考虑以下:

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# 方面改进解决方案?

标签: functional-programmingf#

解决方案


一个简单的方法是声明它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

推荐阅读