Каковы плюсы и минусы каждого из следующих двух способов создания узла дерева?
type TreeNode = | TreeNode of int * (TreeNode option) * (TreeNode option) * (TreeNode option)
type Node = | Node of int * Node * Node
| None
Каковы плюсы и минусы каждого из следующих двух способов создания узла дерева?
type TreeNode = | TreeNode of int * (TreeNode option) * (TreeNode option) * (TreeNode option)
type Node = | Node of int * Node * Node
| None
Они очень близки, но не полностью эквивалентны. На самом деле вы можете довольно хорошо рассуждать о функциональных типах, используя математику (см., например, мою недавнюю статью), но это видно даже неформально.
Учитывая любой TreeNode(num, optLeft, optRight)
, вы всегда можете создать Node
, содержащую ту же информацию (None
типа опции будет сопоставлено с Node.None
).
Интересно, что это не работает наоборот. Если кто-то даст вам Node.None
, вы не сможете превратить его в TreeNode
, потому что TreeNode
нужно хотя бы одно целое число в корне.
Таким образом, они эквивалентны, за исключением того, что второй допускает пустые деревья. С практической точки зрения второй тип кажется более простым в использовании (потому что вам нужно обрабатывать пустое дерево только в одном месте).
TreeNode
имеет трех дочерних элементов вместо двух дляNode
. - person Lee   schedule 25.06.2014