歧视联盟中的fsharp记录

时间:2017-03-20 16:12:27

标签: types f# record

我正在尝试这个结构:

type Tree<'a> =
| Leaf 
| Node of { value:'a ; left:Tree<'a> ; right:Tree<'a> }

但是f#似乎不支持这个(奇怪的)。 但接下来如何使用单独的记录类型执行此操作,然后获取 陷入循环依赖。

2 个答案:

答案 0 :(得分:11)

使用关键字and来处理循环依赖:

type Rec<'a> = { value:'a ; left:Tree<'a> ; right:Tree<'a> }

and Tree<'a> =
| Leaf 
| Node of Rec<'a>

答案 1 :(得分:2)

古斯塔沃的回答很好。请注意,如果为记录类型提供第二个参数,则可以将递归限制为Tree类型:

type Node<'a,'t> = { value : 'a; left : 't; right : 't }
type Tree<'a> = 
| Leaf
| Node of Node<'a,Tree<'a>>

let someTree = 
    Node { value = 1; 
           left = Leaf; 
           right = Node { value = 2; 
                          left = Leaf; 
                          right = Leaf }}