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
F#和#x27;取消装箱浮动x';与';unbox int x';奇怪的编译结果_F#_Type Inference_Units Of Measurement - Fatal编程技术网

F#和#x27;取消装箱浮动x';与';unbox int x';奇怪的编译结果

F#和#x27;取消装箱浮动x';与';unbox int x';奇怪的编译结果,f#,type-inference,units-of-measurement,F#,Type Inference,Units Of Measurement,这是我在看以下问题时提出的: 请注意,我不是在尝试使用这个unbox代码,我只是在回答问题时发现了一些奇怪的行为 为什么下面的代码可以工作 let intToFloat (x:int<'u>) : float<'u> = unbox float x intToFloat 1<second> 让intToFloat(x:int=unbox float x intToFloat 1 而这将产生System.InvalidCastException:无法强制转换

这是我在看以下问题时提出的: 请注意,我不是在尝试使用这个unbox代码,我只是在回答问题时发现了一些奇怪的行为

为什么下面的代码可以工作

let intToFloat (x:int<'u>) : float<'u> = unbox float x
intToFloat 1<second>
让intToFloat(x:int=unbox float x
intToFloat 1
而这将产生System.InvalidCastException:无法强制转换类型为“”的对象float32ToFloat@86-6'输入'Microsoft.FSharp.Core.FSharpFunc'2[System.Single,System.Double]'

让float32ToFloat(x:float32=unbox float x
浮动32ToFloat 1.0f

如果我在
(float x)周围放一些偏执的话
代码按预期工作,因此我假设它一定是某种表达式求值/类型推断规则。这里到底发生了什么,第二种情况下为什么需要偏执?

代码片段中的微妙之处是
unbox float x
-编译器将其视为
(unbox float)x
。因此,这两个函数实际上是这样处理的:

let intToFloat (x:int<'u>) : float<'u> = 
  let f = unbox float in f x

let float32ToFloat (x:float32<'u>) : float<'u> = 
  let f = unbox float in f x
let intToFloat (x:int<'u>) : float<'u> = unbox (float x)
let float32ToFloat (x:float32<'u>) : float<'u> = unbox (float32 x)

Tomas的回答解释了错误,但作为旁注,
unbox
并不是最好的方法。您应该使用
LanguagePrimitives。FloatWithMeasure@Tarmil,我意识到了这一点。感谢您确认
FloatWithMeasure
是一个更好的选择(请参阅我对链接问题的回答)。你介意在那里添加/确认一下吗?哦,我没有看到你链接的问题中的帖子。所以我们几乎说了同样的话:)
let intToFloat (x:int<'u>) : float<'u> = unbox (float x)
let float32ToFloat (x:float32<'u>) : float<'u> = unbox (float32 x)