开发者

F# unbox<int> returns obj

Perhaps a silly que开发者_如何转开发stion, but why does the return value from unbox appear (in my F# Interactive session) to be typed as obj instead of the concrete type int? As far as I can understand (trying to apply existing knowledge from C#) if it's typed as obj then it's still boxed. Example follows:

> (unbox<int> >> box<int>) 42;;
val it : obj = 42
> 42;;
val it : int = 42


Function composition (f >> g) v means g (f (v)), so you're actually calling box<int> at the end (and the call to unbox<int> is not necessary):

> box<int> (unbox<int> 42);;
val it : obj = 42

> box<int> 42;;
val it : obj = 42

The types are box : 'T -> obj and unbox : obj -> 'T, so the functions convert between boxed (objects) and value types (int). You can call unbox<int> 42, because F# automatically inserts conversion from int to obj when calling a function.


On a related note: such a method is actually quite useful. I use it to deal with "the type of an object expression is equal to the initial type" behavior.

let coerce value = (box >> unbox) value

type A = interface end
type B = interface end

let x = 
  { new A
    interface B }

let test (b:B) = printf "%A" b

test x //doesn't compile: x is type A (but still knows how to relax)
test (coerce x) //works just fine
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜