Generics 如何调用Bitconverter.Getbytes generic?
我试过类似上面的方法,但不起作用。类型约束或运行时解析的类型也不存在。另外,我猜答案是否定的,但是是否可以告诉编译器泛型类型只是float32或float?这会省去我很多麻烦 编辑: 我感到惊讶的是,托马斯·佩特里切克所写的东西奏效了,而反过来却不行:Generics 如何调用Bitconverter.Getbytes generic?,generics,f#,inline,type-inference,Generics,F#,Inline,Type Inference,我试过类似上面的方法,但不起作用。类型约束或运行时解析的类型也不存在。另外,我猜答案是否定的,但是是否可以告诉编译器泛型类型只是float32或float?这会省去我很多麻烦 编辑: 我感到惊讶的是,托马斯·佩特里切克所写的东西奏效了,而反过来却不行: let inline set (x: ^t) = BitConverter.ToUInt32(BitConverter.GetBytes(x),0) 这很有趣。如果没有另一篇文章中的conv:BitConvertible,我也无法让它工作。如果
let inline set (x: ^t) = BitConverter.ToUInt32(BitConverter.GetBytes(x),0)
这很有趣。如果没有另一篇文章中的
conv:BitConvertible
,我也无法让它工作。如果您准备做一些不寻常的事情,您可以使用静态解析的类型约束来概括该函数
请注意,这在其他.NET语言中不起作用-静态解析的类型约束完全是F#编译器的一项功能
let inline toUint32 conv x =
let bytes = conv x
BitConverter.ToUInt32(bytes, 0)
toUint32 BitConverter.GetBytes 9999.99f
toUint32 BitConverter.GetBytes 9999.99
然后你可以用它
type BitConvertible =
|BitConvertible
static member Convert (conv : BitConvertible, flt : float) =
System.BitConverter.GetBytes(flt)
static member Convert (conv : BitConvertible, flt32 : float32) =
System.BitConverter.GetBytes(flt32)
module BitConverter =
let inline convertToBytes x =
((^T or ^U) : (static member Convert : ^T * ^U -> byte[]) (BitConvertible, x))
如果您准备做一些不寻常的事情,您可以使用静态解析的类型约束来泛化函数 请注意,这在其他.NET语言中不起作用-静态解析的类型约束完全是F#编译器的一项功能
let inline toUint32 conv x =
let bytes = conv x
BitConverter.ToUInt32(bytes, 0)
toUint32 BitConverter.GetBytes 9999.99f
toUint32 BitConverter.GetBytes 9999.99
然后你可以用它
type BitConvertible =
|BitConvertible
static member Convert (conv : BitConvertible, flt : float) =
System.BitConverter.GetBytes(flt)
static member Convert (conv : BitConvertible, flt32 : float32) =
System.BitConverter.GetBytes(flt32)
module BitConverter =
let inline convertToBytes x =
((^T or ^U) : (static member Convert : ^T * ^U -> byte[]) (BitConvertible, x))
静态成员约束不允许直接编写调用重载方法的内联函数。编译器无法决定是否像参数是
float
或float32
或任何其他受支持的类型那样对函数进行类型检查
简单的解决方案是将转换函数作为单独的参数传递:
let a = BitConverter.convertToBytes 16.0
let b = BitConverter.convertToBytes 27.0f
这需要更多的输入,但很容易看到发生了什么。调用者只需要提供一个进行转换的函数——在典型情况下,可以是BitConverter.GetBytes
另一种方法(已经在另一个答案中讨论过)是使用一种稍微粗糙的技巧,允许您指定更奇特的静态约束;这样就不需要传递显式函数,只要对最终用户隐藏,就可以缩短代码。静态成员约束不允许您直接编写调用重载方法的内联函数。编译器无法决定是否像参数是
float
或float32
或任何其他受支持的类型那样对函数进行类型检查
简单的解决方案是将转换函数作为单独的参数传递:
let a = BitConverter.convertToBytes 16.0
let b = BitConverter.convertToBytes 27.0f
这需要更多的输入,但很容易看到发生了什么。调用者只需要提供一个进行转换的函数——在典型情况下,可以是BitConverter.GetBytes
另一种方法(已经在另一个答案中讨论过)是使用一种稍微粗糙的技巧,允许您指定更奇特的静态约束;这消除了传递显式函数的需要,只要对最终用户隐藏了显式函数,就可以缩短代码。您到底想在这里做什么?想知道如何调用更大的通用函数。虽然我想我已经弄明白了。我并不真的需要“通用”本身,我只需要它接受float32或float<代码>让内联sgeam2 transa transb(α:'t)(A:dMatrix)=这不起作用。相反,我刚刚发现我可以做的是打字
type floatType=float32
然后让内联sgeam2 transa transb(alpha:floatType)(A:dMatrix)(beta:floatType)(B:dMatrix)(C:dMatrix)=
当然,在dMatrix类中,float类型都是floatType。@MarkoGrdinic编辑您的问题,而不是将代码放在注释中。另外,这些注释签名与OP有什么关系?@MarkSeemann基本上,就像我从ManagedCuda访问的cuBLAS sgeam一样,上面的BitConverter.GetBytes()函数具有各种类型的重载,但是我不知道如何写一些东西,让内联RawConvertUInt32 x=BitConverter.ToUInt32(BitConverter.GetBytes(x),0)这是一个F类型的推理问题,非常简单。有这样的泛型函数,例如字节的
对每一个数字类型都做你想要的。你到底想在这里做什么?试图找出如何调用更大的泛型函数。虽然我想我已经弄明白了。我并不真的需要“通用”本身,我只需要它接受float32或float<代码>让内联sgeam2 transa transb(α:'t)(A:dMatrix)=这不起作用。相反,我刚刚发现我可以做的是打字type floatType=float32
然后让内联sgeam2 transa transb(alpha:floatType)(A:dMatrix)(beta:floatType)(B:dMatrix)(C:dMatrix)=
当然,在dMatrix类中,float类型都是floatType。@MarkoGrdinic编辑您的问题,而不是将代码放在注释中。另外,这些注释签名与OP有什么关系?@MarkSeemann基本上,就像我从ManagedCuda访问的cuBLAS sgeam一样,上面的BitConverter.GetBytes()函数具有各种类型的重载,但是我不知道如何写一些东西,让内联RawConvertUInt32 x=BitConverter.ToUInt32(BitConverter.GetBytes(x),0)这是一个F类型的推理问题,非常简单。具有这样的通用函数,例如,字节的对每种数字类型都做您想要的。conv:bitConverable
做什么?这纯粹是为了类型推断吗?如果没有它,我似乎无法让它工作。@MarkoGrdinic是的,如果您可以在float
或float32
上定义静态成员会更容易,但您不能这样做,因为它们是内置类型,并且扩展方法不会出于静态解析类型约束的目的而被检查。相反,您可以通过接受/提供在某些其他(完全任意)类型上定义函数,在本例中是bitcoverable
@MarkoGrdinic