struct - Ocaml 结构,就像我们在 C 中所做的那样
问题描述
我想编写一个递归结构,就像我们在 C 中所做的那样,但在 Ocaml 中。我希望我们包含一个布尔值和一个相同类型元素的递归副本列表。我怎样才能在 Ocaml 中做到这一点?
解决方案
OCaml 类型声明默认是递归的。所以没有什么特别的事情可以做得到你描述的东西。如果你真的想在你的结构里有一个列表,你可以定义这样的东西:
type mystruct = { b: bool; others: mystruct list }
如果你想要一个给定类型结构的“链表”,你可以定义更像这样的东西:
type mystruct2 = { b: bool; rest : mystruct2 option }
这里的一个关键是该rest
元素是一种选项类型,因此您的列表可以在某个时候结束。
还有许多其他方法可以定义这个基本结构。更惯用的 OCaml 定义可能是使用变体类型:
type mylist = Last | Node of bool * mylist
最后一种类型并不完全等价,因为您描述的类型的值始终包含至少一个布尔值,并且这种类型的值 ( Last
) 没有布尔值。在实践中,这通常是你想要的。
更新
以下是每种类型的两个顶级变量。在每一对中,第一个尽可能小,第二个稍大一些。
let v10 = { b = true; others = []}
let v11 = { b = false; others = [ {b = true; others = []} ] }
let v20 = { b = true; rest = None }
let v21 = { b = false; rest = Some { b = true; rest = None } }
let v30 = Last
let v31 = Node (true, Last)
如果您有这样的基本问题,可能值得学习 OCaml 教程,也许是此处列出的教程之一:https ://ocaml.org/learn/tutorials/
推荐阅读
- javascript - js在父类方法中使用反射创建子类
- html - 如何将 Firebase 存储中的文档嵌入 Google/Microsoft 文档查看器
- c++ - 为什么字符串作为指针或字符串作为原始数组在重载函数中总是被称为指针?
- android - Kotlin 协程。Kotlin Flow 和共享偏好。awaitClose 永远不会被调用
- python-3.x - 使用 Python 检查文本文件中的重复单词
- python - 摆脱 subprocess.Popen 中的撇号来移动文件
- django - django.db.utils.OperationalError:(2059,“无法加载身份验证插件'caching_sha2_password':
- go - 读取顶级结构标签
- php - 如何从使用 php while-loop 显示的一组按钮中仅提交一个按钮
- c# - C# 输出参数数组