F# 是否可以使用成员约束生成类型缩写?

F# 是否可以使用成员约束生成类型缩写?,f#,type-alias,F#,Type Alias,它不会意识到,^state必须有一个接口约束,并在记录泛型参数声明中给我一个无法解释的签名和实现差异错误 如果可能的话,我宁愿使用成员约束而不是显式接口,但是我找不到一种方法来使用类型缩写来缩短上述约束声明。在当前的F#?中可能会出现这种情况吗?不,不可能对类型使用静态解析的类型参数 CLR不支持静态解析的类型参数,因此需要在编译时擦除。这可以通过在调用站点内联函数而不是将其编译为IL来实现,但是类型必须具有IL表示,否则在运行时就不能有它的实例 你应该考虑以评估员的形式来表达你的约束,每个成员

它不会意识到,
^state
必须有一个接口约束,并在记录泛型参数声明中给我一个无法解释的签名和实现差异错误


如果可能的话,我宁愿使用成员约束而不是显式接口,但是我找不到一种方法来使用类型缩写来缩短上述约束声明。在当前的F#?

中可能会出现这种情况吗?不,不可能对类型使用静态解析的类型参数

CLR不支持静态解析的类型参数,因此需要在编译时擦除。这可以通过在调用站点内联函数而不是将其编译为IL来实现,但是类型必须具有IL表示,否则在运行时就不能有它的实例

你应该考虑以评估员的形式来表达你的约束,每个成员都有一个约束。这样,即使您的类型将使用“不可接受”的类型参数编译,它的用法也不会,从而有效地约束了整个程序

至于您在示例中描述的
^state
参数的问题,我不太清楚它是什么:您的函数中没有任何成员访问权限,因此我不知道它如何导致与成员相关的错误



在评论中回答您的问题:不,不可能在类型别名中包含成员约束以供重用

如果访问器函数指的是内联函数的类型,例如
let inline dispose v=(^b:(member dispose:unit->unit)v)
,那么我到处都在使用它们。我上面展示的只是我的2k LOC库的一小部分,所以我不确定是否有必要展示实现。与常规let函数不同,编译器要求我在类和记录中显式写出成员约束,而不是自己推断它们,所以我真的在问是否可以缩写类型约束。现在我正在尝试使用继承来做这件事,并且在使用继承约束时得到了非常无用的类型错误。基本上,整个库都是内联的,为了简洁起见,使用了静态解析的类型参数。试着更具体一些。试着提供一些例子,以及你得到的预期结果和错误信息。我认为(不确定)你可能没有抓住要点。为什么要使用成员?不,我的意思是相反的问题:为什么需要使用OO样式的成员而不是函数样式的函数、透镜等?查看关键字
inline
。这是F#对你所要做的事情的最佳近似。
type FFRec<'state when 'state: (member Tape: Stack<unit -> unit>)
                   and 'state: (member Mem: ObjectPool)
                   and 'state: (member Str: CudaStream)
                   and 'state: (member Workspace: Workspace)
                   and 'state: (member IsInferenceOnly: bool)> =
    {
    W: d2M
    b: d2M
    a: d2M -> 'state -> d2M * 'state
    }
let inline reluInitializer (state: ^state) (a: ^a)  =
    let scale = (1.0f / sqrt(addDims a |> float32))
    fillRandomUniformMatrix((str state),a,scale,0.0f)
    a