-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path15_4.hs
36 lines (27 loc) · 1.5 KB
/
15_4.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
{--
Задача 15-4
Одеров Роман, 545 гр.
--}
data Tree = Empty
| Node Integer Tree Tree
-- левосторонний обход
{-
Запускаем foldTree от поддерева с обновленным "аккумулятором", равным вычисленному значению функции от другого поддерева.
Здесь левое поддерево считается сначала.
-}
foldTree f start Empty = start
foldTree f start (Node n l r) = foldTree f (foldTree f (f n start) l) r
-- правосторонний обход
{-
Запускаем foldTree от поддерева с обновленным "аккумулятором", равным вычисленному значению функции от другого поддерева.
Здесь левое поддерево считается сначала.
-}
foldTree' f start Empty = start
foldTree' f start (Node n l r) = foldTree' f (foldTree' f (f n start) r) l
-- что-то, основанное на простой рекурсивной идее: f(Node i l r) = f(l) и f(r)
foldTree'' f start Empty = start
foldTree'' f start (Node n l r) = f (foldTree'' f (f n start) l) (foldTree'' f start r)
{-
Никак не придумать, как сделать нечто более общее...
Или как записать, например, высоту дерева с помощью имеющихся выше функций.
-}