syntax - 如何更改 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))
解决方案
该类型的值example_type
是不可变的。OCaml 中的变量(如ab
)也是不可变的。所以你不能改变ab
绑定的值,或者改变值本身的内部。
在函数式编程中,您计算新值而不是修改旧值。
example_type
对于它的价值,您的示例值对您声明的内容无效。构造C
函数接受 3 个值,但你只有 2 个。
此外,ab
它只是一个变量,而不是类型变量。这是一个绑定到 type 值的名称example_type
。
这是一个从 type 的值中消除所有B
s 的函数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
。它构造了一个新的值。
推荐阅读
- android - 使用FFmpeg在surfaceview中获取当前帧大小
- javascript - const 和 let 在作用域链中创建上下文对象吗?
- amazon-web-services - 在 AWS 上安装 Neo4j(指令失败)
- python - 使用 python 在 SQL Server 中快速插入数据
- javascript - 如何使用 setState 更新对象中的状态
- javascript - Laravel 5.8 从空值创建默认对象
- javascript - 通过表单传递 Google Analytics 跟踪信息
- git - 为什么我的更改被移动到 Git Merge 上的另一个文件?
- javascript - 如何将查询字符串与 json 数据匹配?
- linux - 如何设置 OpenMP 以使用整个超线程进行并行处理?