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 为什么内联函数的类型推断会强制参数为某种类型,而不是将其限制为op_显式?_Generics_F#_Constraints_Type Inference - Fatal编程技术网

Generics 为什么内联函数的类型推断会强制参数为某种类型,而不是将其限制为op_显式?

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

F#中一个非常方便的特性是,您可以进行内联并保持一定级别的值类型多态性(尽管我认为“duck-typing”更合适):

但是,当我将其扩展为包含在某个类型中时,F#推断出第一个参数是
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)