跳转到内容

CDuce/Types/Coercion

来自维基教科书,开放的书籍,开放的世界

向上静态强制转换

[编辑 | 编辑源代码]
let x = 7;;
-> val x : 7 = 7

x 的值为 7,类型为 7(包含整数七的单例)

let y1 = (x : Int);;
let y2 : Int = x;;

这两个向上强制转换的结果相同:值为 7,类型为 Int。这是可能的,因为单例 7 是整数集的子集。

动态强制转换

[编辑 | 编辑源代码]

静态向下强制转换不可行

type Positive = 1--*
let y = (7 : Int);;
let yp = (y : Positive);;
-> This expression should have type:
   Positive
   but its inferred type is:
   Int
   which is not a subtype, as shown by the sample:
   *--0

但动态向下强制转换可行

let yp1 :? Positive = y;;
let yp2 = (y :? Positive);;

如果强制转换不可行,则在执行时会引发一个异常

let ybad = (y :? Char);;
-> Uncaught CDuce exception: "Value 7 does not match type Empty\n"

消息中包含 "Empty" 是因为动态强制转换会给出合取类型。这可以通过以下方式看到

(7 : 1--8) :? 5--10;;

它看起来具有类型 5--8

请注意,对于向上强制转换,静态方法效率更高,并且提供更好的错误处理。此外,由于合取机制,向上强制转换不能是动态的

(7 : 1--8) :? Int;;

仍然是类型 1--8,而不是 Int。

华夏公益教科书