如何在(功能)F# 中创建递归数据结构值?

2024-01-01

type 的值如何:

type Tree =
    | Node of int * Tree list

有一个以函数方式生成的引用自身的值吗?

对于 Tree 的合适定义,结果值应等于以下 Python 代码中的 x:

x = Tree()
x.tlist = [x]

Edit: 显然需要更多解释。我正在尝试学习 F# 和函数式编程,所以我选择实现覆盖树 http://en.wikipedia.org/wiki/Cover_tree我之前用其他语言编程过。这里相关的是,每个级别的分数都是下一级分数的子集。该结构在概念上达到了无穷级。

在命令式语言中,节点有一个包含其自身的子节点列表。我知道这可以在 F# 中强制完成。不,考虑到覆盖树算法,它不会创建无限循环。


Tomas 的回答提出了两种在 F# 中创建递归数据结构的可能方法。第三种可能性是利用记录字段支持直接递归的事实(当在定义记录的同一程序集中使用时)。例如,以下代码可以正常运行:

type 'a lst = Nil | NonEmpty of 'a nelst
and 'a nelst = { head : 'a; tail : 'a lst }

let rec infList = NonEmpty { head = 1; tail = infList }

使用此列表类型而不是内置列表类型,我们可以使您的代码正常工作:

type Tree = Node of int * Tree lst
let rec x = Node(1, NonEmpty { head = x; tail = Nil })
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在(功能)F# 中创建递归数据结构值? 的相关文章

随机推荐