【发布时间】:2019-01-29 18:02:48
【问题描述】:
我正在学习使用 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# 方面改进解决方案?
【问题讨论】:
-
如果您还没有看过它们,thesepages 的 F# 文档可能会有所帮助,以及查看 source code of FSharpPlus。