如何将命名字符串类型转换为字符串

How to cast named string type to string

我有一个命名的字符串类型:

type t = string

所以我可以这样做:

let (x:t) = "Hello";;
(* val x : t = "Hello" *)
x ^ "Hi";;
(* - : t = "HelloHi" *)

我的问题是如何将字符串 x 恢复为类型 string 以便我在其他地方将其用作字符串?

主要限制是我不想更改类型 t 以使用这样的构造函数:

type t = StringType of string

我想做的事情可行吗?

正如@PierreG 所说,您的类型 t 只是 string 的同义词。您无需执行任何操作即可将 t 类型的值视为字符串。

您可能想知道的一个原因是顶层需要在类型的可用同义名称中进行选择。它会尝试选择一个看起来像您最近一直在考虑价值的方式。但是所有名称(如 tstring)都同样有效。

你不需要这样做,在我的顶层(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