如何在 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_valuestring 看起来像:

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"

为什么?

Noneoption 类型的构造函数。如果 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 字符串。