假设我们具有以下类型和类型变量:
type example_type = A | B | C of example_type * example_type * example_type
let ab = C(A, C(A, B))
我如何设法输出ab的修改或修改后的副本?
例如,应满足以下条件:
val ab : example_type = C(A, C(A, A))
或val new_ab : example_type = C(A, C(A, A))
答案 0 :(得分:2)
example_type
类型的值是不可变的。 OCaml中的变量(例如ab
)也是不可变的。因此,您无法更改绑定到ab
的值,也不能更改值本身的内部。
在函数式编程中,您可以计算新值而不是修改旧值。
对于价值而言,您的示例值对于声明的example_type
无效。 C
构造函数采用3个值,但是只有2个。
此外,ab
只是一个变量,而不是类型变量。这是绑定到类型example_type
的值的名称。
这是一个从类型B
的值中消除所有example_type
的函数。而是用A
代替它们。
let rec replace_b x =
match x with
| B -> A
| A -> A
| C (p, q, r) ->
C (replace_b p, replace_b q, replace_b r)
请注意,此函数不会修改其参数x
。它构造了一个新值。