Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 如何调用Bitconverter.Getbytes generic?_Generics_F#_Inline_Type Inference - Fatal编程技术网

Generics 如何调用Bitconverter.Getbytes generic?

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,我也无法让它工作。如果

我试过类似上面的方法,但不起作用。类型约束或运行时解析的类型也不存在。另外,我猜答案是否定的,但是是否可以告诉编译器泛型类型只是float32或float?这会省去我很多麻烦

编辑:

我感到惊讶的是,托马斯·佩特里切克所写的东西奏效了,而反过来却不行:

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