-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlast.hs
More file actions
32 lines (31 loc) · 1003 Bytes
/
last.hs
File metadata and controls
32 lines (31 loc) · 1003 Bytes
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
data E = X String | C Int | A E E | S E E | M E E | D E E
data R a = Ok a | Fail String
instance Monad R where
return = Ok
(Ok x) >>= f = f x
(Fail s) >>= _ = Fail s
eval s (X n) = s n
eval _ (C n) = Ok n
--eval s (A x y) = (>>=) (eval s x) (\ x' ->
-- (>>=) (eval s y) (\ y' ->
-- return $ x' + y'))
eval s (A x y) = do
x' <- eval s x
y' <- eval s y
return $ x' + y'
eval s (S x y) = (>>=) (eval s x) (\ x' ->
(>>=) (eval s y) (\ y' ->
return $ x' - y'))
eval s (M x y) = (>>=) (eval s x) (\ x' ->
(>>=) (eval s y) (\ y' ->
return $ x' * y'))
eval s (D x y) = (>>=) (eval s x) (\ x' ->
(>>=) (eval s y) (\ y' ->
if y' == 0 then Fail "Division by zero" else return $ x' `div` y'))
--монада в хаскелле класс типов
-- * -> *
--монада вычилсение, которое возвращает a
-- bind заменить на >>=
-- e>>=(\x -> E
-- do x <- e E) // do нотация
--монадические законы