Методы троичного дерева - Стандарт МЛ
Тройной тип дерева определяется как:
datatype ’a tree =
Leaf of ’a
| Node of ’a tree * ’a tree * ’a tree
Мне нужно изменить функции map & foldl, чтобы они соответствовали троичному дереву...
fun tree_map (f : ’a -> ’b) (t : ’a tree) : ’b tree =
f,nil) = nil
| map (f,x::xs) = f(x) :: (map (f,xs))
fun tree_foldl (f : ’a * ’a -> ’a) (n: ’a) (t : ’a tree) : ’a =
(f,ie,nil) = ie
| foldl (f,ie,x::xs) = foldl (f, f(x,ie), xs);
Я знаю, что это, вероятно, простая модификация, но я не могу обернуть голову вокруг логики. Я не понимаю, как это будет отличаться для двоичного дерева... какие-нибудь указатели?
1 ответ
Хорошей отправной точкой при определении функции для алгебраического типа данных является наличие одного "шаблона соответствия" для каждого случая.
Я бы начал так, поскольку базовые случаи (довольно) очевидны:
fun tree_map f (Leaf x) = Leaf (f x)
| tree_map f (Node (t1, t2, t3)) = Node (something involving t1, t2, and t3)
fun tree_foldl f ie (Leaf x) = f(ie, x)
| tree_foldl f ie (Node (t1, t2, t3)) = ... something involving t1, t2, and t3 ...
Интересные фрагменты оставлены в качестве упражнения.