В вашем примере C # вы используете тип Tree
, который не является универсальным - предположительно, это тип, который содержит определенный тип ключей и значений. Напротив, ваш тип F # Tree<'k, 'v>
является универсальным типом, что означает, что если вы хотите использовать его, вы должны указать, какие типы вы хотите использовать в качестве ключей и значений.
Это означает, что если вы хотите создать список деревьев, вам нужно решить, какой тип ключей и значений будет. Имя F # для List
- ResizeArray
, поэтому вы можете написать что-то вроде:
let tree = new ResizeArray<Tree<string, int>>()
В некоторых случаях вы можете написать универсальный код, в котором не нужно указывать типы. Например, вы могли бы написать функцию, которая создает список из двух одноэлементных деревьев:
let twoSingletons k v =
let res = new ResizeArray<Tree<string, int>>()
res.Add(TreeNode(k, v, EmptyTree, EmptyTree))
res.Add(TreeNode(k, v, EmptyTree, EmptyTree))
res
Чаще всего вам не нужно писать такой код. Если вы используете списки F #, а не ResizeArray
, тогда вы можете использовать нотацию [ .. ]
для создания списка, и вам не нужно беспокоиться об указании типов явно. Вывод типа заботится об этом:
let twoSingletons k v =
[ TreeNode(k, v, EmptyTree, EmptyTree)
TreeNode(k, v, EmptyTree, EmptyTree) ]