F#模块扩展名与类型扩展名

时间:2011-05-20 14:01:39

标签: f#

如果我想为标准偏差定义浮点数组的扩展方法,那么在数组模块上使用模块扩展或在类型float[]上使用扩展名会更好吗? 喜欢:

module Array =
   let std (arr: float[]) = ...

type float ``[]`` with 
    member this.std = ...

如果我按后者键入扩展名,std只能计算一次或每次使用吗?

而且,对于后者来说,正确的格式是什么,type float ``[]`` with显然不会... ...谢谢。

1 个答案:

答案 0 :(得分:5)

在这种情况下,您无法定义类型扩展名,因此问题没有实际意义 - 您必须使用Array模块的扩展名。您无法定义类型扩展的原因是,在F#中,类型扩展必须完全镜像类型定义,因此您可以在通用'a list类型上定义类型扩展,但不能在构造类型上定义string list。同样,您可以在(模拟)通用数组类型

上定义扩展方法
'a ``[]``

但不在构造的数组类型

float ``[]``

此行为与C#不同,在C#中可以在构造的泛型类型上编写扩展方法。