Generics 如何让F#编译器推断泛型函数的参数?

Generics 如何让F#编译器推断泛型函数的参数?,generics,f#,Generics,F#,我已经编写了一些测试代码来了解泛型的语法: let add_stuff<'T> x y = printfn "%A" (x + y) let stuff() = add_stuff 5.5 2.4 add_stuff 3 4 let add_stuff您不能为此使用泛型,因为泛型是在运行时解析的,不会因内联而变化 您需要使用将在编译时解析的: let inline add_stuff (x: ^X) (y: ^Y) = printfn "%A" (

我已经编写了一些测试代码来了解泛型的语法:

let add_stuff<'T> x y =
   printfn "%A" (x + y)

let stuff() = 
    add_stuff 5.5 2.4
    add_stuff 3 4

let add_stuff您不能为此使用泛型,因为泛型是在运行时解析的,不会因内联而变化

您需要使用将在编译时解析的:

let inline add_stuff (x: ^X) (y: ^Y) =
    printfn "%A" (x + y)
静态解析的类型参数主要与成员约束结合使用,成员约束允许您指定类型参数必须具有特定成员才能使用。使用常规泛型类型参数无法创建此类约束


该代码有两个问题:

首先,任何参数都不使用泛型类型
'T
。参数需要声明为
'T
类型,如下所示:

// val add_stuff: 'T -> 'T -> unit
let add_stuff<'T> (x:'T) (y:'T) =
    printfn "%A" (x + y)
请注意,类型签名的不同之处在于
'T
是一种泛型类型,可以在运行时解决
^T
是一个SRTP,它需要在编译时解析,因此
内联
关键字

如果没有使用
+
运算符,则不需要内联它。注意
pair\u stuff
add\u stuff
之间的区别:

// val pair_stuff: 'T -> 'W -> unit
let pair_stuff (x:'T) (y:'W) =
    printfn "%A" (x , y)

// val add_stuff:  ^a -> ^b -> unit
let inline add_stuff x y =
    printfn "%A" (x + y)

let stuff() = 
    add_stuff 5.5 2.4
    add_stuff 3 4
    pair_stuff 5.5 2.4
    pair_stuff 3 4

stuff()
// 7.9
// 7
// (5.5, 2.4)
// (3, 4)

谢谢你的回答!很难在所有答案中做出选择,但我选择AMieres的答案纯粹是为了进一步解释。
// val pair_stuff: 'T -> 'W -> unit
let pair_stuff (x:'T) (y:'W) =
    printfn "%A" (x , y)

// val add_stuff:  ^a -> ^b -> unit
let inline add_stuff x y =
    printfn "%A" (x + y)

let stuff() = 
    add_stuff 5.5 2.4
    add_stuff 3 4
    pair_stuff 5.5 2.4
    pair_stuff 3 4

stuff()
// 7.9
// 7
// (5.5, 2.4)
// (3, 4)