Generics 为什么内联函数的类型推断会强制参数为某种类型,而不是将其限制为op_显式?
F#中一个非常方便的特性是,您可以进行内联并保持一定级别的值类型多态性(尽管我认为“duck-typing”更合适): 但是,当我将其扩展为包含在某个类型中时,F#推断出第一个参数是Generics 为什么内联函数的类型推断会强制参数为某种类型,而不是将其限制为op_显式?,generics,f#,constraints,type-inference,Generics,F#,Constraints,Type Inference,F#中一个非常方便的特性是,您可以进行内联并保持一定级别的值类型多态性(尽管我认为“duck-typing”更合适): 但是,当我将其扩展为包含在某个类型中时,F#推断出第一个参数是float,即使我明确要求转换为float。我遗漏了什么,或者更好的是,我如何才能找回op_Explicit行为?我尝试添加静态成员约束,但似乎没有帮助: type XTest<'T> = | Value of 'T | Other of 'T // a is inferred
float
,即使我明确要求转换为float。我遗漏了什么,或者更好的是,我如何才能找回op_Explicit
行为?我尝试添加静态成员约束,但似乎没有帮助:
type XTest<'T> =
| Value of 'T
| Other of 'T
// a is inferred as float, b as req. op_Explicit
static member inline Divide a b =
match a with
| Value x ->
match b with
| Value y ->
let res = float x / float y
XTest.Value res |> Some
| _ -> failwith "not implemented"
| Other x-> Some (XTest.Other x)
type XTest这不是因为类型推断失败。事实上,如果你仔细观察,你会发现y
被正确地推断为'a(需要op\u显式)
由于“故障”只适用于x
,而不适用于y
,让我们看看x
与y
有什么不同
答案在最后一行:x
用于构造XTest的实例,这不是因为类型推断失败。事实上,如果你仔细观察,你会发现y
被正确地推断为'a(需要op\u显式)
由于“故障”只适用于x
,而不适用于y
,让我们看看x
与y
有什么不同
答案在最后一行:x
用于构造xtestThank的实例,非常好的答案,一如既往:)。它也隐式地显示了解决方案。我只需要让类型推断知道x
不是已知的float
类型,我将最后一行更改为Some(XTest.Other(float x))
。谢谢,回答得很好,一如既往:)。它也隐式地显示了解决方案。我只需要让类型推断知道x
不属于float
类型,我将最后一行更改为Some(XTest.Other(float x))
。
type XTest<'T> =
| Value of 'T
| Other of 'T
// a is inferred as float, b as req. op_Explicit
static member inline Divide a b =
match a with
| Value x ->
match b with
| Value y ->
let res = float x / float y
XTest.Value res |> Some
| _ -> failwith "not implemented"
| Other x-> Some (XTest.Other x)