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)