首页 > 解决方案 > 如何更改 OCaml 中的类型变量?

问题描述

假设我们有以下类型和类型变量:

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))

标签: syntaxocaml

解决方案


该类型的值example_type是不可变的。OCaml 中的变量(如ab)也是不可变的。所以你不能改变ab绑定的值,或者改变值本身的内部。

在函数式编程中,您计算​​新值而不是修改旧值。

example_type对于它的价值,您的示例值对您声明的内容无效。构造C函数接受 3 个值,但你只有 2 个。

此外,ab它只是一个变量,而不是类型变量。这是一个绑定到 type 值的名称example_type

这是一个从 type 的值中消除所有Bs 的函数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。它构造了一个新的值。


推荐阅读