@@ -3,67 +3,83 @@ package app.impl.scalaz
3
3
import org .junit .Test
4
4
5
5
/**
6
- * Created by pabloperezgarcia on 09/11/2017.
6
+ * Created by pabloperezgarcia on 09/11/2017..
7
+ *
8
+ * With Scalaz writer patter basically we can create our own builder patter.
9
+ *
10
+ * Applying the flatMap function we receive a type class which we append the old value with the new value, giving us
11
+ * a last type class with all appended values.
12
+ *
13
+ * We create our monoids which using also type class pattern we can give the implementation depending the type class we use.
7
14
*/
8
15
class WriterMonad {
9
16
10
- case class Writer [A , D ](value : A , diary : D )(implicit m : MonadId [D ]) {
17
+ case class Writer [A , D ](value : A , appendValue : D )(implicit m : Monoid [D ]) {
11
18
12
19
def flatMap [B ](f : A => Writer [B , D ]) = f(value) match {
13
- case Writer (result, d) => Writer (result, m.append(diary, d))
20
+ case Writer (result, newAppendValue) =>
21
+ Writer (result, m.append(appendValue, newAppendValue))
14
22
}
15
23
16
- def map [B ](f : A => B ) = Writer [B , D ](f(value), diary )
24
+ def map [B ](f : A => B ) = Writer [B , D ](f(value), appendValue )
17
25
}
18
26
19
- trait MonadId [T ] {
27
+ trait Monoid [T ] {
20
28
def zero : T
21
29
22
30
def append (a : T , b : T ): T
23
31
}
24
32
25
- object MonadId {
26
- implicit val StringMonoid = new MonadId [String ] {
33
+ object Monoid {
34
+ implicit val StringMonoid = new Monoid [String ] {
27
35
override def zero = " "
28
36
29
37
override def append (s1 : String , s2 : String ) = s1 + s2
30
38
}
31
39
32
- implicit val IntMonoid = new MonadId [Int ] {
40
+ implicit val IntMonoid = new Monoid [Int ] {
33
41
override def zero = 0
34
42
35
- override def append (s1 : Int , s2 : Int ) = s1 * s2
43
+ override def append (s1 : Int , s2 : Int ) = s1 + s2
36
44
}
37
45
38
- implicit val FooMonoid = new MonadId [Foo ] {
46
+ implicit val FooMonoid = new Monoid [Foo ] {
39
47
override def zero = Foo (" " )
40
48
41
- override def append (s1 : Foo , s2 : Foo ) = Foo (s1.value.concat( s2.value) )
49
+ override def append (s1 : Foo , s2 : Foo ) = Foo (s1.value + s2.value)
42
50
}
43
51
}
44
52
45
53
@ Test
46
54
def stringWriter (): Unit = {
47
- val result = Writer (5 , " " )
48
- .flatMap(num => Writer (num + 3 , " added three" ))
49
- println(result.value)
50
- println(result.diary)
55
+ val result = Writer (0 , " " )
56
+ .flatMap(num => Writer (num + 1 , " page 1" ))
57
+ .flatMap(num => Writer (num + 1 , " page 2" ))
58
+ .flatMap(num => Writer (num + 1 , " page 3" ))
59
+ println(s " Total number of pages: ${result.value}" )
60
+ println(result.appendValue)
51
61
}
52
62
53
63
@ Test
54
64
def intWriter (): Unit = {
55
- val result = Writer (5 , 5 )
56
- .flatMap(num => Writer (num + 5 , 10 ))
65
+ val result = Writer (1 , 1 )
66
+ .flatMap(num => Writer (num + 1 , 10 ))
67
+ .flatMap(num => Writer (num + 1 , 20 ))
68
+ .flatMap(num => Writer (num + 1 , 30 ))
69
+ .flatMap(num => Writer (num + 1 , 40 ))
57
70
println(result.value)
58
- println(result.diary )
71
+ println(result.appendValue )
59
72
}
60
73
61
74
@ Test
62
75
def fooWriter (): Unit = {
63
- val result = Writer (Foo (" hello" ), Foo (" writer" ))
76
+ val result = Writer (Foo (" " ), Foo (" " ))
77
+ .flatMap(foo => Writer (foo, Foo (" hello" )))
78
+ .flatMap(foo => Writer (foo, Foo (" writer" )))
79
+ .flatMap(foo => Writer (foo, Foo (" monad" )))
64
80
.flatMap(foo => Writer (foo, Foo (" world" )))
65
81
println(result.value)
66
- println(result.diary )
82
+ println(result.appendValue )
67
83
}
68
84
69
85
case class Foo (value : String )
0 commit comments