F#模块扩展与类型扩展

mat*_*ser 6 f#

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

module Array =
   let std (arr: float[]) = ...
Run Code Online (Sandbox Code Playgroud)

要么

type float ``[]`` with 
    member this.std = ...
Run Code Online (Sandbox Code Playgroud)

如果我输入扩展作为后者,是否std只计算一次或每次使用它?

而且,后者的正确格式是什么,显然type float ``[]`` with不会导致...谢谢.

kvb*_*kvb 5

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

'a ``[]``
Run Code Online (Sandbox Code Playgroud)

但不是在构造的数组类型上

float ``[]``
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为C#和F#扩展功能在概念上是不同的,它们的语法不同.虽然F#强调类型定义的扩展,但C#扩展仅作为静态方法实现,并且实际上可以这样调用(第一个参数标记为"this").因此,如果您熟悉C#扩展,那么您可以在"this"参数上重载是完全合理的.而且你倾向于将它们视为它们的实例,使用实例语法的静态方法. (2认同)
  • @Daniel - 我认为两种方式都有很好的论据,我只是声称F#的方法不一定是不足的.我认为,鉴于F#中模块的不错选择,这一点尤其正确. (2认同)