代码之家  ›  专栏  ›  技术社区  ›  Eamon Nerbonne

了解F内联和静态解析的类型参数:F铸造示例

  •  4
  • Eamon Nerbonne  · 技术社区  · 14 年前

    具有静态解析的通用参数的Fipe的内联函数似乎类似于C++的模板。但是,与C++不同,您需要指定约束——它是如何工作的?

    例如,我正在尝试实现一个上溯函数,但这不起作用:

    let inline myUpcast< ^a, ^b  when ^a :> ^b  > (x: ^a) :  ^b =  x
    

    错误消息为:error fs0698:无效约束:用于约束的类型是密封的,这意味着约束最多只能由一个解决方案满足。

    实际上,我正在尝试编写一个函数,当可以强制转换基础类型时,该函数将强制转换序列(以解决缺乏协方差的问题),但以下两种方法也不太管用:

    let inline upcastseq (xs: seq< ^a >) : seq< ^b > when ^a :> ^b = xs :?> seq< ^b >
    

    这将导致以下警告:警告fs0064:此构造导致代码的通用性低于类型批注所指示的通用性。类型变量“a”已被约束为类型“^b”。正如当时可能预期的那样,实际使用该函数并不像预期的那样工作。

    所以,我在寻找一个函数,如果用协变无效的方式转换序列(因此是通用参数限制),它会导致类型检查错误,这是可能的吗?

    更一般地说,与C++模板相比,静态解析类型参数的局限性是什么?

    1 回复  |  直到 14 年前
        1
  •  4
  •   Community basarat    7 年前

    // doesn't work
    let myUpcast<'a, 'b when 'a :> 'b) (x: 'a) : 'b = unbox (box x)
    

    How to constrain one type parameter by another