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# 已经有内置实现的东西创建函数的原因是我想使用类似的东西和自定义类型 - 例如,复数。
考虑以下:
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# 方面改进解决方案?
解决方案
一个简单的方法是声明它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
推荐阅读
- javascript - 高级 Vue 路由器防护
- docker - 如何从以前的安装中恢复我的容器?
- wordpress - 如何确保简码结果不会破坏格式?
- excel - 将动态控件添加到 Excel VBA 用户窗体中的框架时出错
- scheme - 如何从字符列表中输出字符网格?
- android - 应用程序没有向用户显示任何可见的崩溃,但 android vitals 仍然给我 Firebase 的崩溃报告
- c++ - 为什么可以从类中的对象访问类的私有变量?
- python-3.x - 无法从 azure devops 安装 mcafee-epo
- javascript - 如何仅使用终端输出vscode打开JS文件时显示的问题列表:?
- command - 在某些情况下,命令是否应该“无所事事”