F#模块扩展与类型扩展

F#模块扩展与类型扩展,f#,F#,如果我想为浮点数组定义一个扩展方法,比如标准偏差,那么在数组模块上使用模块扩展还是在类型float[]上使用扩展更好? 比如: 或 如果我像后者那样进行类型扩展,std是否只计算一次或每次使用它 而且,后者的正确格式是什么,显然键入float``[]`` with并不有趣。。。谢谢。在这种情况下,您无法定义类型扩展,因此问题没有意义-您必须使用数组模块的扩展。无法定义类型扩展的原因是,在F#中,类型扩展必须完全镜像类型定义,因此您可以在泛型'a列表类型上定义类型扩展,例如,但不能在构造的类型字符

如果我想为浮点数组定义一个扩展方法,比如标准偏差,那么在数组模块上使用模块扩展还是在类型
float[]
上使用扩展更好? 比如:

如果我像后者那样进行类型扩展,
std
是否只计算一次或每次使用它


而且,后者的正确格式是什么,显然
键入float``[]`` with
并不有趣。。。谢谢。

在这种情况下,您无法定义类型扩展,因此问题没有意义-您必须使用
数组
模块的扩展。无法定义类型扩展的原因是,在F#中,类型扩展必须完全镜像类型定义,因此您可以在泛型
'a列表
类型上定义类型扩展,例如,但不能在构造的类型
字符串列表
上定义类型扩展。类似地,您可以在(模拟的)泛型数组类型上定义扩展方法

'a ``[]``
但不是在构造的数组类型上

float ``[]``

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

@Daniel-我不这样做。然而,我认为F#的行为是有意义的——为什么类型扩展不应该镜像类型定义?构造的泛型类型的实例上的方法依赖于其类型参数,这难道不奇怪吗?@kvb:是的,但在泛型接口上似乎很有意义。例如,
stringjoin(这是IEnumerable parts)
似乎是合理的。我认为C#和F#扩展特性在概念上是不同的,因为它们的语法不同。F#强调类型定义的扩展,而C#扩展仅作为静态方法实现,实际上可以这样调用(第一个参数标记为“this”)。因此,如果您熟悉C#扩展,那么能够重载“this”参数是非常有意义的。你倾向于认为它们是什么,带有实例语法的静态方法。@Daniel-我认为这两种方法都有很好的论据,我只是说F#的方法不一定有缺陷。考虑到F#中模块的良好替代方案,我认为这一点尤其正确。在F#中既可以使用C#扩展方法,也可以在F#中创建C#风格的扩展方法,这是C#可以使用的。如果C风格的扩展方法也可以在F中使用(我似乎无法使该部分正常工作),那么可能会以这种方式实现您想要的功能。
'a ``[]``
float ``[]``