如何在 OCaml 中构建正确的类型转换?
How to construct a correct type transformation in OCaml?
为了从构造类型tainted_value
映射到其他类型,以及从其他基本类型映射到构造类型tainted_value
,构造了两个函数。
首先,类型tainted_value
定义为:
type object_ = int
and location = Obj of object_ | Null
and closure = var * cmd * stack
and value = Fld of string | Int of int | Loc of location | Clo of closure
and tainted_value = Val of value | Error
如果我只是让我的第一个函数映射从 tainted_value
到 string
看起来像:
let tva_to_string tva1 = match tva1 with
| Val (Fld e) -> e
| _ -> None
它报告错误为:
This expression has type 'a option but an expression was expected of type string
但是,如果我把None
改成failwith "Empty"
就不会return错误了:
let tva_to_string tva1 = match tva1 with
| Val (Fld e) -> e
| _ -> failwith "Empty"
为什么?
None
是 option
类型的构造函数。如果 match
returns None
中的一个子句,则其他子句必须 return 类型 option
的某个其他值。他们也可能引发异常,这就是 failwith
函数所做的。
option
的另一个构造函数是 Some
,因此您可能正在寻找:
let tva_to_string tva1 = match tva1 with
| Val (Fld e) -> Some e
| _ -> None
这将减轻您的类型检查问题。当然,它仍然没有 return 一个 string
所以你的函数命名需要一些工作,或者你需要 return 字符串。
为了从构造类型tainted_value
映射到其他类型,以及从其他基本类型映射到构造类型tainted_value
,构造了两个函数。
首先,类型tainted_value
定义为:
type object_ = int
and location = Obj of object_ | Null
and closure = var * cmd * stack
and value = Fld of string | Int of int | Loc of location | Clo of closure
and tainted_value = Val of value | Error
如果我只是让我的第一个函数映射从 tainted_value
到 string
看起来像:
let tva_to_string tva1 = match tva1 with
| Val (Fld e) -> e
| _ -> None
它报告错误为:
This expression has type 'a option but an expression was expected of type string
但是,如果我把None
改成failwith "Empty"
就不会return错误了:
let tva_to_string tva1 = match tva1 with
| Val (Fld e) -> e
| _ -> failwith "Empty"
为什么?
None
是 option
类型的构造函数。如果 match
returns None
中的一个子句,则其他子句必须 return 类型 option
的某个其他值。他们也可能引发异常,这就是 failwith
函数所做的。
option
的另一个构造函数是 Some
,因此您可能正在寻找:
let tva_to_string tva1 = match tva1 with
| Val (Fld e) -> Some e
| _ -> None
这将减轻您的类型检查问题。当然,它仍然没有 return 一个 string
所以你的函数命名需要一些工作,或者你需要 return 字符串。