-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathstep3.hs
39 lines (30 loc) · 1.94 KB
/
step3.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
class Printable a where
toString :: a -> String
instance Printable Bool where
toString False = "false"
toString True = "true"
instance Printable () where
toString () = "unit type"
instance (Printable a, Printable b) => Printable (a, b) where
toString (a, b) = "(" ++toString (a) ++ "," ++ toString (b) ++ ")"
--Задайте реализацию по умолчанию метода stompOrStab,
--которая вызывает метод stomp, если переданное ему значение приводит в ярость Морка;
--вызывает stab, если оно приводит в ярость Горка и вызывает сначала stab, а потом stomp,
--если оно приводит в ярость их обоих. Если не происходит ничего из вышеперечисленного,
--метод должен возвращать переданный ему аргумент.
--Класса типов KnownToGorkAndMork является расширением обоих этих классов,
--предоставляя дополнительно метод stompOrStab:
--Пусть существуют два класса типов KnownToGork и KnownToMork,
--которые предоставляют методы stomp (stab) и doesEnrageGork (doesEnrageMork) соответственно:
class KnownToGork a where
stomp :: a -> a
doesEnrageGork :: a -> Bool
class KnownToMork a where
stab :: a -> a
doesEnrageMork :: a -> Bool
class (KnownToGork a, KnownToMork a) => KnownToGorkAndMork a where
stompOrStab :: a -> a
stompOrStab a | (doesEnrageGork a, doesEnrageMork a) == (True, False) = stab a
| (doesEnrageGork a, doesEnrageMork a) == (False, True) = stomp a
| (doesEnrageGork a, doesEnrageMork a) == (True, True) = stomp (stab a)
| (doesEnrageGork a, doesEnrageMork a) == (False, False) = a