如何为泛型类型编写扩展方法,其中一个类型变量必须是字符串?

Lay*_*lez 3 generics extension-methods f#

特别是,我想为这种类型编写一个扩展方法:

type Frame<'TRowKey, string when 'TRowKey : equality> with
  member frame.someMethod =
    // code
Run Code Online (Sandbox Code Playgroud)

使用该代码,我收到此错误:

类型名称中的意外标识符.预期的中缀运算符,引号或其他标记.

更换stringString的结果相同.

原始类型Frame<'TRowKey, 'TColumnKey (requires equality and equality)>来自Deedle库.

scr*_*wtp 5

@Gustavo彻底解答了如何使用扩展方法.但是如果你没有特别强烈的理由将它作为扩展方法(比如C#interop),那么你可能会使用一个简单的函数:

type Frame<'row, 'col> = { row: 'row; col: 'col }

module Frame = 
    let restricted (frame: Frame<'row, string>) = frame

Frame.restricted { row = 3; col = "test" } // compiles
Frame.restricted { row = 3; col = 5 }      // doesn't
Run Code Online (Sandbox Code Playgroud)

这就是我在编写F#-only代码时所考虑的更清晰的方法 - 当它们作为类型的内在部分没有意义时,let-bound函数优于方法,并且来自属性的噪声更少.