【发布时间】:2011-03-06 09:54:37
【问题描述】:
一个值怎么可能有类型:
type Tree =
| Node of int * Tree list
有一个引用自身以函数方式生成的值吗?
在下面的 Python 代码中,结果值应该等于 x,以获得合适的 Tree 定义:
x = Tree()
x.tlist = [x]
编辑:显然需要更多解释。我正在尝试学习 F# 和函数式编程,所以我选择实现我之前用其他语言编写的 cover tree。这里相关的是,每个级别的点都是下一个级别的点的子集。该结构在概念上达到了无穷级。
在命令式语言中,节点有一个包含自身的子节点列表。我知道这可以在 F# 中强制完成。不,考虑到覆盖树算法,它不会创建无限循环。
【问题讨论】:
-
对于我们这些不太会说 Python 的人来说,您能否详细说明这个问题?您的类型定义看起来不错,但请注意,F# 不允许直接构造可区分联合类型(例如,树)......仅构造联合值;例如,Node,如 "let x = Node( 0, [] )" 或 "let y = Node( 1, [x] )",其中 [] 是空列表。
-
@James:他想创建一个自己的子节点。就像
let rec x = Node (something, [x])一样(除非那不起作用)。 -
@sepp2k:这通常会为遍历列表的任何代码创建一个无限循环,尽管...非常不受欢迎 :-) 我已经看到在其他语言中这样做以标记列表的结尾,但 idomatic F# 会为此目的使用另一个 DU 值,例如“None”。
-
您不是尝试使用 F# 语法编写 Python 代码,而是究竟想要做什么?就其价值而言,纯粹的函数式循环数据结构是一种思维方式(参见haskell.org/haskellwiki/Tying_the_Knot),您最好使用非循环数据结构编写代码。
-
@sepp2k:谢谢,这正是我的意思。 @朱丽叶:感谢您的链接。请参阅上面编辑过的问题。
标签: f# tail-recursion recursive-datastructures