-
Notifications
You must be signed in to change notification settings - Fork 23
/
lab11-writer-s.hs
39 lines (32 loc) · 1.12 KB
/
lab11-writer-s.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
--- Monada Writer care scrie mesaje de logging într-un string
newtype WriterS a = Writer {runWriter :: (a, String)}
instance Monad WriterS where
return va = Writer (va, "")
ma >>= k =
let (va, log1) = runWriter ma
(vb, log2) = runWriter (k va)
in Writer (vb, log1 ++ log2)
instance Applicative WriterS where
pure = return
mf <*> ma = do
f <- mf
a <- ma
return (f a)
instance Functor WriterS where
fmap f ma = pure f <*> ma
tell :: String -> WriterS ()
tell log = Writer ((), log)
---- Exercițiul 1.1 ----
-- Incrementează argumentul cu 1 și concatenează un mesaj care să anunțe asta
logIncrement :: Int -> WriterS Int
logIncrement x = Writer (x + 1, "Incrementez " ++ show x ++ "\n")
-- Apelează de două ori consecutiv funcția de incrementare de mai sus
logIncrement2 :: Int -> WriterS Int
logIncrement2 x = logIncrement x >>= logIncrement
---- Exercițiul 1.2 ----
-- Apelează de N ori funcția de incrementare
logIncrementN :: Int -> Int -> WriterS Int
logIncrementN x n
| n <= 0 = undefined
| n == 1 = logIncrement x
| otherwise = logIncrementN x (n - 1) >>= logIncrement