2011-05-20 179 views
6

如果我想定义一个类似于标准偏差的浮点数组的扩展方法,对于float[]类型的数组模块或扩展使用模块扩展会更好吗? 喜欢:F#模块扩展与类型扩展

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

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

如果我做类型的扩展名,因为后者,将在std只计算一次或每次使用时间呢?

而且,后者的正确格式是什么,实际上type float ``[]`` with不是comile ...谢谢。

回答

5

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

'a ``[]`` 

但不是在构成阵列型的(模拟的)通用阵列型定义一个扩展方法

float ``[]`` 

此行为是不同于C#,在那里它可以写入不同扩展方法构造的泛型类型。

+0

@kvb:你知道_why_他们在F#中的工作方式不同吗? – Daniel 2011-05-20 14:15:32

+0

@丹尼尔 - 我不知道。但是,我认为F#的行为确实有道理 - 为什么不应该键入扩展镜像类型定义?构造泛型类型的实例上的方法依赖于它的类型参数似乎并不奇怪吗? – kvb 2011-05-20 14:21:14

+0

@kvb:是的,但它似乎对通用接口非常有意义。例如'string Join(这个IEnumerable 部分)'似乎是合理的。 – Daniel 2011-05-20 14:36:07