处理f#的任意数组



我试图在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

最新更新