我试图在f#中创建一个模块,我需要一些类型的数组的一些任意类型和一些任意长度。
来举个例子,假设我需要做一个任意大向量计算的模块。
那么我的想法是
module Vector =
type Vector = V of array<_>
let (+) (v1:Vector) (v2:Vector) = Vector.map2 (+) V1 V2
但这不起作用,因为map2函数还没有为向量声明,这就是问题所在,我如何为具有相同属性和数组的新类型声明map2函数?
函数map2
已经存在,因此您可以重用它。
但是请注意,如果您为(+)
使用let绑定函数,则只能在类型内部访问它,因此您应该使用静态成员来代替。
然后调用现有的map2
函数,你可以使用模式匹配来分解你的Single-Case discriminatedunion:
type Vector<'t> = V of array<'t> with
static member (+) (V v1, V v2) = V (Array.map2 (+) v1 v2)
但是如果您仍然想为您的类型创建map2
函数,为了以更通用的方式使用它,您可以这样创建它:
type Vector<'t> = V of array<'t> with
static member map2 f (V v1) (V v2) = V (Array.map2 f v1 v2)
static member (+) (v1, v2) = Vector<_>.map2 (+) v1 v2