чем повествует сказка про репку вы все наверняка курсе Если кто забыл

 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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
О чем повествует сказка про репку, вы все наверняка в курсе.
Если кто забыл - напомню:
> module Main where
> import Prelude hiding (putStrLn, print)
> import System.IO.UTF8
> import Data.List (intersperse, find)
Вы скажете - в сказке такого не было? Погодите - скоро сказка сказывается, не скоро дело делается. Так вот, жили-были любители репы:
> едоки :: Едоки
> едоки = [ "дедка", "бабка", "внучка", "жучка", "кошка", "мышка" ]
> type ЛюбительРепы = String
> type Едоки = [ЛюбительРепы]
Потом, как известно, дед посадил репку. Вскоре прошел радиоактивный дождик, после которого репка выросла большая-пребольшая, а курочка - снесла яичко, не простое, а золотое. Конец, как известно, печальный - мышка бежала, хвостиком махнула, и прогремел невероятной силы взрыв ... Впрочем, это уже совсем другая сказочка.
Вернемся к репке:
> main = do
> putStrLn "Посадил дед репку. Выросла репка большая-пребольшая. Пришло время ее тянуть ..."
> тянуть
Как известно, дед самостоятельно не справился с задачей и стал звать подмогу. Сначала бабку, потом внучку ... - и с каждым подходом их становилось все больше и больше:
> подходы :: [ Едоки ]
> подходы = scanl зазвать [] едоки
> where зазвать толпа подмога = подмога:толпа
Выстроившись по старшинству, по команде "Взялись!" они брались за впереди стоящего:
> взялись :: Едоки -> [ (ЛюбительРепы, ЛюбительРепы) ]
> взялись едоки = zip едоки' ("репка":едоки')
> where едоки' = reverse едоки -- а не то дед будет тянуть самым последним
, и получалась такая вот диспозиция: дедка - за репку, бабка - за дедку ... Тянут-потянут! ... Ну, всем известно, что до прихода мышки репка не вытягивается. Попробуем это описать:
> описать ситуация
> | null ситуация = ""
> | otherwise = unwords [ "Взялись:"
> , concat $ intersperse ", " $ map за ситуация
> , ". Тянут-потянут -- " ++ что_же_получилось
> ]
> where
> за (кто,кого) = кто ++ " за " ++ винительный_падеж кого
> винительный_падеж ы = init ы ++ "у"
> что_же_получилось = if elem "мышка" (map fst ситуация)
> then "вытянули репку!"
> else "вытянуть не могут!"
Сказка про репку, являющаяся типичным образцом формульной сказки (или сказки с кумулятивной экспозицией), заключается в том, что рассказчик последовательно описывает все диспозиции (хотя правильнее говорить - "экспозиции") вплоть до последней, ставящей точку в нагромождении сюжета:
> тянуть = mapM_ putStrLn $ map (описать.взялись) подходы
Вы прослушали русскую народную сказку про репку в чиста функциональном исполнении. Благодарю за внимание :)