Объявление списка специального типа в F # - PullRequest
0 голосов
/ 05 ноября 2019

Здесь у меня есть этот простой тип дерева двоичного поиска:

type Tree<'k, 'v> =
    | EmptyTree
    | TreeNode of 'k * 'v * Tree<'k,'v> * Tree<'k,'v>

В C #, если у нас есть класс с именем Tree, мы можем написать

List<Tree> tree = new List<Tree>() 

, но как я могу объявить списоктипа дерева в F #?

1 Ответ

2 голосов
/ 05 ноября 2019

В вашем примере 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) ] 
...