【发布时间】:2019-10-29 18:48:41
【问题描述】:
我想在 F# 中编写一些通用函数和类型来处理向量。我有多种不同的数据类型,带有静态 (+) 和 (*) 运算符,因此我可以将它们相加并乘以标量(现在为 floats)。
例如,我已经成功构建了一个 Vec2 类,我可以在其中编写代码
let v = 3.0 * Vec2(1.,1.) + Vec2(3.,4.)
假设我还有一个Vec3 或任何其他类型的向量。这是我想写的两个示例(伪代码):
向量的通用函数
我认为这可以通过断言'V 具有(+) 和(*) 的静态解析类型约束来实现,但我无法让它工作。如果我可以将我的类型约束命名如下,那就太好了。
let average<'V when 'V : vector> (v1:'V) (v2:'V) =
0.5 * (v1 + v2)
有没有实际可行的替代方案?
本身就是向量类型的泛型类型
对于任何类型的'T 和表示向量的类型'V,我们可以像向量一样添加和标量乘法函数'T -> 'V。我想建立一个像
type VecFunc<'T,'V when 'V : vector> = ...
作为一个简单的示例,f : VecFunc<int,Vec2> 可以存储一个函数,该函数采用 int x 并返回一个 Vec2,两个组件都等于 float x。也许我们可以通过调用Eval 方法来评估底层函数:
f.Eval(3) // would return Vec2(3.,3.)
我想将 VecFunc<int,Vec2> 视为向量类型,给它 (+) 和 (*) 操作,以便我可以计算
(-2.0 * f + f).Eval(2) // returns Vec2(-4., -4.)
或结合第一个例子:
(average f g).Eval(1) // ...
有没有什么方法可以使用 F# 接口或者类型参数来实现这些结果?
【问题讨论】:
标签: generics f# linear-algebra generic-constraints