forked from belyaev-mikhail/fp-practice-2019
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTask4_2.hs
47 lines (38 loc) · 2.96 KB
/
Task4_2.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
module Task4_2 where
{-
Задание 4.1
Реализация монады над множеством из четырёх элементов.
Реализуйте все требуемые классы типов и объясните, почему они реализованы именно так.
-}
data FourOf a = FourOf a a a a deriving(Show,Eq)
-- реализуйте классы `Functor`, `Applicative` и `Monad` для типа `FourOf`
-- таким образом, что
-- do { x <- FourOf 1 2 3 4; y <- FourOf 4 6 7 8; return $ x + y } == FourOf 5 8 10 12
------------------------------реализуйте классы `Functor`-----------------------------
-- в fmap мы берем функцию и множество обернутое в контекст, затем применяем функцию
-- к каждому элементу множества и возвращаем снова значения в контексте
instance Functor FourOf where
fmap f (FourOf a b c d) = FourOf (f a) (f b) (f c) (f d)
------------------------------реализуйте классы `Applicative`----------------------------
-- pure всегда будет возвращать значение FourOf с множеством из 4-х а
-- в случае с функцие ниже, мы принимаем множество функций обернутое в контекст (a b c d)
-- и множество значений также обернутое в контекс (a' b' c' d') затем применяем каждую
-- функцию к своему аргументу в виде (a a') (b b') и так далее
-- и опять же возвращаем множество в контексте
instance Applicative FourOf where
pure a = FourOf a a a a
(<*>) (FourOf a b c d) (FourOf a' b' c' d') = FourOf (a a') (b b') (c c') (d d')
---------------------------------реализуйте классы `Monad`--------------------------------
-- return принимает на вход аргумент а и возвращает монаду из множество значений аргумента
-- в случае следующей функции мы принимаем обернутое в контекст множество значений и
-- применяем функцию f к каждому элементу множества при этом данная функция возвращает
-- значения в контексте, следовательно нам из каждой из четырех монад нужно вытащить
-- нужный аргумент и поместить все четыре значения в один контекст
instance Monad FourOf where
return a = FourOf a a a a
(>>=) (FourOf a b c d) f = FourOf (fa $ f a) (fb $ f b) (fc $ f c) (fd $ f d)
where
fa (FourOf a _ _ _) = a
fb (FourOf _ b _ _) = b
fc (FourOf _ _ c _) = c
fd (FourOf _ _ _ d) = d