首页 > 解决方案 > Ocaml 结构,就像我们在 C 中所做的那样

问题描述

我想编写一个递归结构,就像我们在 C 中所做的那样,但在 Ocaml 中。我希望我们包含一个布尔值和一个相同类型元素的递归副本列表。我怎样才能在 Ocaml 中做到这一点?

标签: structtypesmoduleocaml

解决方案


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/


推荐阅读