我有一个命名字符串类型:
type t = string
所以我可以这样做:
let (x:t) = "Hello";;
(* val x : t = "Hello" *)
x ^ "Hi";;
(* - : t = "HelloHi" *)
我的问题是如何才能将字符串x
返回到 string ,以便我在其他地方将其用作字符串?
主要限制是我不想要更改类型t以使用这样的构造函数:
type t = StringType of string
我想做的是什么?
答案 0 :(得分:1)
正如@PierreG所说,您的类型t
只是string
的同义词。您无需执行任何操作即可将t
类型的值视为字符串。
您可能想知道的一个原因是顶层需要在类型的可用同义名称中进行选择。它试图选择一个看起来像你最近一直在考虑价值的方式。但所有名称(如t
和string
)都同样有效。
答案 1 :(得分:1)
你不需要这样做,在我的顶级(OCaml 4.01.0)上,这非常好:
# type t = string;;
type t = string
# let x:t = "Hello";;
val x : t = "Hello"
# String.contains x 'H';;
- : bool = true
但是我没有得到别名类型的要求,OCaml类型推断非常强大,因此通常可以避免显式类型声明,让编译器为你推断它们。
例如
# type t = string;;
type t = string
# let f x y = compare x y;;
val f : 'a -> 'a -> int = <fun>
# let x : t = "Hello";;
val x : t = "Hello"
# let y : t = "Hello";;
val y : t = "Hello"
# f x y;;
- : int = 0
无需使用任何显式数据类型注释f
。