На пути к изучению F # я столкнулся с проблемой, которую не могу решить. Я определил пользовательский тип:
type BinTree =
| Node of int * BinTree * BinTree
| Empty
Я создал функцию, которая берет дерево, обходит его, добавляет посещаемые элементы в список и возвращает его:
let rec inOrder tree =
seq{
match tree with
| Node (data, left, right) ->
yield! inOrder left
yield data;
yield! inOrder right
| Empty -> ()
}
|> Seq.to_list;
Теперь я хочу создать функцию, подобную этой, которая берет дерево и функцию, пересекает ее и применяет функцию к каждому узлу, а затем возвращает дерево:
mapInOrder : ('a -> 'b) -> 'a BinTree -> 'b BinTree
Это кажется легким, и, вероятно, так и есть! Но я не уверен, как вернуть дерево. Я пробовал это:
let rec mapInOrder f tree =
match tree with
| Node(data, left, right) ->
mapInOrder f left
Node(f(data), left, right)
mapInOrder f right
| Empty -> ()
но это возвращает единицу. Раньше я не работал с пользовательскими типами, так что я, вероятно, что-то там упустил!