-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathexpand.hs
34 lines (21 loc) · 1.28 KB
/
expand.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
infixl 6 :+:
infixl 7 :*:
data Expr = Val Int | Expr :+: Expr | Expr :*: Expr
deriving (Show, Eq)
--Исправьте определение функции expand так, чтобы она,
--используя дистрибутивность (а также, возможно, ассоциативность и коммутативность),
--возвращала значение, эквивалентное данному и являющееся суммой произведений числовых значений.
expand :: Expr -> Expr
expand ((e1 :+: e2) :*: e) = expand e1 :*: expand e :+: expand e2 :*: expand e
expand (e :*: (e1 :+: e2)) = expand e :*: expand e1 :+: expand e :*: expand e2
expand ((e1 :*: e2) :+: e) = expand e1 :*: expand e2 :+: expand e
expand (e :+: (e1 :*: e2)) = expand e :+: expand e1 :*: expand e2
expand (e :+: (e1 :+: e2)) = expand e :+: expand e1 :+: expand e2
expand ((e1 :+: e2) :+: e) = expand e1 :+: expand e2 :+: expand e
expand (e :*: (e1 :*: e2)) = expand e :*: expand e1 :*: expand e2
expand ((e1 :*: e2) :*: e) = expand e1 :*: expand e2 :*: expand e
expand (e1 :+: e2) = expand e1 :+: expand e2
expand (e2 :+: e1) = expand e2 :+: expand e1
expand (e1 :*: e2) = expand e1 :*: expand e2
expand (e2 :*: e1) = expand e2 :*: expand e1
expand e = e