-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path3.3,5.hs
108 lines (84 loc) · 5 KB
/
3.3,5.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
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
module Demo where
{-
Реализуйте c использованием функции zipWith функцию fibStream, возвращающую бесконечный список чисел Фибоначчи.
GHCi> take 10 $ fibStream
[0,1,1,2,3,5,8,13,21,34]
-}
fibStream :: [Integer]
fibStream = [0,1] ++ zipWith (+) fibStream (tail fibStream)
{-
Предположим, что функция repeat, была бы определена следующим образом:
repeat = iterate repeatHelper
определите, как должна выглядеть функция repeatHelper.
-}
repeatHelper n = n
{-
Пусть задан тип Odd нечетных чисел следующим образом:
data Odd = Odd Integer
deriving (Eq, Show)
Сделайте этот тип представителем класса типов Enum.
GHCi> succ $ Odd (-100000000000003)
Odd (-100000000000001)
Конструкции с четным аргументом, типа Odd 2, считаются недопустимыми и не тестируются.
Примечание. Мы еще не знакомились с объявлениями пользовательских типов данных, однако, скорее всего, приведенное объявление не вызовет сложностей. Здесь объявляется тип данных Odd с конструктором Odd. Фактически это простая упаковка для типа Integer. Часть deriving (Eq, Show) указывает компилятору, чтобы он автоматически сгенерировал представителей соответствующих классов типов для нашего типа (такая возможность имеется для ряда стандартных классов типов). Значения типа Odd можно конструировать следующим образом:
GHCi> let x = Odd 33
GHCi> x
Odd 33
и использовать конструктор данных Odd в сопоставлении с образцом:
addEven :: Odd -> Integer -> Odd
addEven (Odd n) m | m `mod` 2 == 0 = Odd (n + m)
| otherwise = error "addEven: second parameter cannot be odd"
-}
-- data Odd = Odd Integer deriving (Eq,Show)
-- не убирайте комментарий с предыдущей строки
-- определение Odd уже присутствует в вызывающей программе
data Odd = Odd Integer deriving (Eq, Show)
instance Enum Odd where
succ (Odd a) = Odd (a + 2)
pred (Odd a) = Odd (a - 2)
toEnum a = Odd (3 + 2 * (toInteger(a) - 1))
fromEnum (Odd a) = fromIntegral ((a - 1) `div` 2)
enumFrom = iterate succ
enumFromThen (Odd a) (Odd b) =
map Odd [a, b ..]
enumFromTo (Odd a) (Odd b) =
map Odd [a, a + 2 .. b]
enumFromThenTo (Odd a) (Odd b) (Odd c) =
map Odd [a, b .. c]
addEven :: Odd -> Integer -> Odd
addEven (Odd n) m | m `mod` 2 == 0 = Odd (n + m)
| otherwise = error "addEven: second parameter cannot be odd"
test0 = succ (Odd 1) == (Odd 3)
test1 = pred (Odd 3) == (Odd 1)
-- enumFrom
test2 = (take 3 $ [Odd 1 ..]) == [Odd 1,Odd 3,Odd 5]
-- enumFromTo
-- -- По возрастанию
test3 = (take 3 $ [Odd 1..Odd 7]) == [Odd 1,Odd 3,Odd 5]
-- -- По убыванию
test4 = (take 3 $ [Odd 7..Odd 1]) == []
-- enumFromThen
-- -- По возрастанию
test5 = (take 3 $ [Odd 1, Odd 3 ..]) == [Odd 1,Odd 3,Odd 5]
-- -- По убыванию
test6 = (take 3 $ [Odd 3, Odd 1 ..]) == [Odd 3,Odd 1,Odd (-1)]
-- enumFromThenTo
-- -- По возрастанию
test7 =([Odd 1, Odd 5 .. Odd 7]) == [Odd 1,Odd 5]
-- -- По убыванию
test8 =([Odd 7, Odd 5 .. Odd 1]) == [Odd 7,Odd 5,Odd 3,Odd 1]
-- -- x1 < x3 && x1 > x2
test9 =([Odd 7, Odd 5 .. Odd 11]) == []
-- -- x1 > x3 && x1 < x2
test10 =([Odd 3, Odd 5 .. Odd 1]) == []
allTests = zip [0..] [test0, test1, test2, test3, test4, test5, test6, test7, test8, test9, test10]
{-
Пусть есть список положительных достоинств монет coins, отсортированный по возрастанию. Воспользовавшись механизмом генераторов списков, напишите функцию change, которая разбивает переданную ей положительную сумму денег на монеты достоинств из списка coins всеми возможными способами. Например, если coins = [2, 3, 7]:
GHCi> change 7
[[2,2,3],[2,3,2],[3,2,2],[7]]
Примечание. Порядок монет в каждом разбиении имеет значение, то есть наборы [2,2,3] и [2,3,2] — различаются.
Список coins определять не надо.
-}
change :: (Ord a, Num a) => a -> [[a]]
change 0 = [[]]
change m = [coin:ch | coin <- coins, coin <= m, ch <- (change (m - coin))]