我正在尝试在 F# 中创建一个模块,其中我需要一些由某种任意类型和任意长度的数组组成的类型。
举个例子,假设我需要制作一个用于任意大向量计算的模块。
那么我的想法是
module Vector =
type Vector = V of array<_>
let (+) (v1:Vector) (v2:Vector) = Vector.map2 (+) V1 V2
但这不起作用,因为尚未为向量声明map2函数,这就是问题,如何为具有相同探针和数组的新类型声明map2函数?
最佳答案
数组的函数 map2
已经存在,因此您可以重用它。
但请注意,如果您对 (+)
使用 let 绑定(bind)函数,则只能在类型内部访问它,因此您应该使用静态成员。
然后,要调用现有的 map2
函数,您可以使用模式匹配来分解单例区分联合:
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
关于types - 处理 F# 的任意数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40119422/