F#模块扩展与类型扩展
问题描述:
如果我想定义一个类似于标准偏差的浮点数组的扩展方法,对于float[]
类型的数组模块或扩展使用模块扩展会更好吗? 喜欢:F#模块扩展与类型扩展
module Array =
let std (arr: float[]) = ...
或
type float ``[]`` with
member this.std = ...
如果我做类型的扩展名,因为后者,将在std
只计算一次或每次使用时间呢?
而且,后者的正确格式是什么,实际上type float ``[]`` with
不是comile ...谢谢。
答
在这种情况下,您无法定义类型扩展,所以问题没有实际意义 - 您必须使用Array
模块的扩展。您无法定义类型扩展的原因是,在F#中,类型扩展必须与类型定义完全相同,因此您可以在通用'a list
类型上定义类型扩展,但不能在类型string list
上定义类型扩展。同样,可以
'a ``[]``
但不是在构成阵列型的(模拟的)通用阵列型定义一个扩展方法
float ``[]``
此行为是不同于C#,在那里它可以写入不同扩展方法构造的泛型类型。
@kvb:你知道_why_他们在F#中的工作方式不同吗? – Daniel 2011-05-20 14:15:32
@丹尼尔 - 我不知道。但是,我认为F#的行为确实有道理 - 为什么不应该键入扩展镜像类型定义?构造泛型类型的实例上的方法依赖于它的类型参数似乎并不奇怪吗? – kvb 2011-05-20 14:21:14
@kvb:是的,但它似乎对通用接口非常有意义。例如'string Join(这个IEnumerable部分)'似乎是合理的。 –
Daniel
2011-05-20 14:36:07