为什么F#约束我的代码并删除泛型?

迈克·克莱因(Maik Klein)
type VBO<'T when 'T : (new : unit -> 'T) and 'T : struct and 'T :> ValueType> = 
    { Handle : int
      target : BufferTarget
      size : int
      dataSize : int
      data : 'T []
      pos : int
      usage : BufferUsageHint }

type VBO = 
    static member Create(target, size, pos, usage, (data : Vector3 [])) = 
        VBO.CreateImpl(target, size, pos, usage, Vector2.SizeInBytes, data)

    // Type mismatch. Expecting Vector3 but found Vector2
    static member Create(target, size, pos, usage, (data : Vector2 [])) = 
        VBO.CreateImpl(target, size, pos, usage, Vector2.SizeInBytes, data)

    // This construct causes code to be less generic than indicated by the type annotations.
    // The type variable 'T has been constrained to be type 'Vector3'.
    static member CreateImpl(target, size, pos, usage, dataSize, (data : 'T [])) = 
        let h = GL.GenBuffer()
        { Handle = h
          target = target
          size = size
          dataSize = dataSize
          data = data
          pos = pos
          usage = usage }

F#试图约束我的代码,但我希望它是通用的。我真的不在乎数据是什么类型,我只需要将其传递给正确的dataSize即可。

我做错了什么?

GS-向Monica致歉

如果在同一代码块中的特定实例中使用泛型类型,则F#编译器似乎将泛型类型专门化。尝试像这样拆分声明:

type VBO<'T when 'T : (new : unit -> 'T) and 'T : struct and 'T :> ValueType> = 
    { Handle : int
      target : BufferTarget
      size : int
      dataSize : int
      data : 'T []
      pos : int
      usage : BufferUsageHint }

type VBO = 
    static member CreateImpl(target, size, pos, usage, dataSize, (data : 'T [])) = 
        let h = GL.GenBuffer()
        { Handle = h
          target = target
          size = size
          dataSize = dataSize
          data = data
          pos = pos
          usage = usage }

type VBO with
    static member Create(target, size, pos, usage, (data : Vector3 [])) = 
        VBO.CreateImpl(target, size, pos, usage, Vector2.SizeInBytes, data)

    static member Create(target, size, pos, usage, (data : Vector2 [])) = 
        VBO.CreateImpl(target, size, pos, usage, Vector2.SizeInBytes, data)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么F#约束我的代码并删除泛型?

来自分类Dev

F#泛型约束

来自分类Dev

f#中的嵌套泛型约束

来自分类Dev

为什么我不能通过约束将派生泛型类型转换为基础非泛型类型?

来自分类Dev

为什么我不能(通过约束)将派生泛型类型转换为基础非泛型类型?

来自分类Dev

为什么F#泛型结构具有额外的__dummy字段?

来自分类Dev

为什么此具有成员约束的F#代码无法编译?

来自分类Dev

为什么实现具有类型约束的泛型接口的泛型类需要重复这些约束?

来自分类Dev

为什么在具有可比约束的泛型函数中丢失泛型类型信息?

来自分类Dev

受涉及静态类型转换的f#方法约束的泛型类型

来自分类Dev

具有类型约束的泛型类上的F#模式匹配

来自分类Dev

为什么我们不能扩展泛型?

来自分类Dev

为什么我们不能扩展泛型?

来自分类Dev

为什么我的泛型不带子类?

来自分类Dev

为什么我不能从泛型参数访问属性?

来自分类Dev

为什么我必须转换这个泛型类型?

来自分类Dev

F#泛型不是那么泛型

来自分类Dev

F#中对泛型的泛型操作

来自分类Dev

为什么我的泛型泛型不能按预期工作?

来自分类Dev

内部函数的F#泛型

来自分类Dev

F#泛型/函数重载语法

来自分类Dev

为什么协变隐式强制转换会忽略泛型约束?

来自分类Dev

当where约束应该足够时,为什么需要强制转换泛型类型

来自分类Dev

为什么泛型 T 仅在具有约束时才被推断为文字类型?

来自分类Dev

为什么在F#中不编译匹配的代码版本

来自分类Dev

F#泛型:我可以将类型限制为不是“单位”吗?

来自分类Dev

F#中的OCaml样式泛型类型参数的语法是什么?

来自分类Dev

将F#泛型函数约束为并集类型?

来自分类Dev

为什么F#警告我忽略结果

Related 相关文章

  1. 1

    为什么F#约束我的代码并删除泛型?

  2. 2

    F#泛型约束

  3. 3

    f#中的嵌套泛型约束

  4. 4

    为什么我不能通过约束将派生泛型类型转换为基础非泛型类型?

  5. 5

    为什么我不能(通过约束)将派生泛型类型转换为基础非泛型类型?

  6. 6

    为什么F#泛型结构具有额外的__dummy字段?

  7. 7

    为什么此具有成员约束的F#代码无法编译?

  8. 8

    为什么实现具有类型约束的泛型接口的泛型类需要重复这些约束?

  9. 9

    为什么在具有可比约束的泛型函数中丢失泛型类型信息?

  10. 10

    受涉及静态类型转换的f#方法约束的泛型类型

  11. 11

    具有类型约束的泛型类上的F#模式匹配

  12. 12

    为什么我们不能扩展泛型?

  13. 13

    为什么我们不能扩展泛型?

  14. 14

    为什么我的泛型不带子类?

  15. 15

    为什么我不能从泛型参数访问属性?

  16. 16

    为什么我必须转换这个泛型类型?

  17. 17

    F#泛型不是那么泛型

  18. 18

    F#中对泛型的泛型操作

  19. 19

    为什么我的泛型泛型不能按预期工作?

  20. 20

    内部函数的F#泛型

  21. 21

    F#泛型/函数重载语法

  22. 22

    为什么协变隐式强制转换会忽略泛型约束?

  23. 23

    当where约束应该足够时,为什么需要强制转换泛型类型

  24. 24

    为什么泛型 T 仅在具有约束时才被推断为文字类型?

  25. 25

    为什么在F#中不编译匹配的代码版本

  26. 26

    F#泛型:我可以将类型限制为不是“单位”吗?

  27. 27

    F#中的OCaml样式泛型类型参数的语法是什么?

  28. 28

    将F#泛型函数约束为并集类型?

  29. 29

    为什么F#警告我忽略结果

热门标签

归档