@@ -8,86 +8,79 @@ object Test extends App {
88
99 case class Circle (x : Double , y : Double , radius : Double )
1010
11- given circleOps : {
12- def (c : Circle ) circumference : Double = c.radius * math.Pi * 2
13- }
11+ given circleOps : extension (c : Circle ) with
12+ def circumference : Double = c.radius * math.Pi * 2
1413
1514 val circle = new Circle (1 , 1 , 2.0 )
1615
1716 assert(circle.circumference == circleOps.circumference(circle))
1817
19- given stringOps : {
20- def ( xs : Seq [ String ]) longestStrings : Seq [String ] = {
18+ given stringOps : extension ( xs : Seq [ String ]) with
19+ def longestStrings : Seq [String ] =
2120 val maxLength = xs.map(_.length).max
2221 xs.filter(_.length == maxLength)
23- }
24- }
22+
2523 val names = List (" hi" , " hello" , " world" )
2624 assert(names.longestStrings == List (" hello" , " world" ))
2725
28- given seqOps : {
29- def [T ](xs : Seq [T ]) second = xs.tail.head
30- }
26+ given extension [T ](xs : Seq [T ]) with
27+ def second = xs.tail.head
3128
3229 assert(names.longestStrings.second == " world" )
3330
34- given listListOps : {
35- def [T ](xs : List [List [T ]]) flattened = xs.foldLeft[List [T ]](Nil )(_ ++ _)
36- }
31+ given listListOps : extension [T ](xs : List [List [T ]]) with
32+ def flattened = xs.foldLeft[List [T ]](Nil )(_ ++ _)
3733
38- // A right associative op
34+ // A right associative op. Note: can't use given extension for this!
3935 given prepend : {
4036 def [T ](x : T ) :: (xs : Seq [T ]) = x +: xs
4137 }
38+
4239 val ss : Seq [Int ] = List (1 , 2 , 3 )
4340 val ss1 = 0 :: ss
4441 assert(ss1 == List (0 , 1 , 2 , 3 ))
4542
4643 assert(List (names, List (" !" )).flattened == names :+ " !" )
4744 assert(Nil .flattened == Nil )
4845
49- trait SemiGroup [T ] {
46+ trait SemiGroup [T ] with
5047 def (x : T ) combine (y : T ): T
51- }
52- trait Monoid [T ] extends SemiGroup [T ] {
48+
49+ trait Monoid [T ] extends SemiGroup [T ] with
5350 def unit : T
54- }
5551
56- given StringMonoid : Monoid [String ] {
52+ given StringMonoid : Monoid [String ] with
5753 def (x : String ) combine (y : String ): String = x.concat(y)
5854 def unit : String = " "
59- }
6055
6156 // Abstracting over a typeclass with a context bound:
6257 def sum [T : Monoid ](xs : List [T ]): T =
6358 xs.foldLeft(implicitly[Monoid [T ]].unit)(_.combine(_))
6459
6560 println(sum(names))
6661
67- trait Ord [T ] {
62+ trait Ord [T ] with
6863 def (x : T ) compareTo (y : T ): Int
6964 def (x : T ) < (y : T ) = x.compareTo(y) < 0
7065 def (x : T ) > (y : T ) = x.compareTo(y) > 0
7166 val minimum : T
72- }
67+ end Ord
7368
74- given Ord [Int ] {
69+ given Ord [Int ] with
7570 def (x : Int ) compareTo (y : Int ) =
7671 if (x < y) - 1 else if (x > y) + 1 else 0
7772 val minimum = Int .MinValue
78- }
7973
80- given ListOrd [T : Ord ] : Ord [List [T ]] {
81- def (xs : List [T ]) compareTo (ys : List [T ]): Int = (xs, ys) match {
74+ given listOrd [T : Ord ]: Ord [List [T ]] with
75+ def (xs : List [T ]) compareTo (ys : List [T ]): Int = (xs, ys) match
8276 case (Nil , Nil ) => 0
8377 case (Nil , _) => - 1
8478 case (_, Nil ) => + 1
8579 case (x :: xs1, y :: ys1) =>
8680 val fst = x.compareTo(y)
8781 if (fst != 0 ) fst else xs1.compareTo(ys1)
88- }
8982 val minimum : List [T ] = Nil
90- }
83+ end listOrd
9184
9285 def max [T : Ord ](x : T , y : T ): T = if (x < y) y else x
9386
@@ -98,35 +91,33 @@ object Test extends App {
9891
9992 println(max(List (1 , 2 , 3 ), List (2 )))
10093
101- trait Functor [F [_]] {
94+ trait Functor [F [_]] with
10295 def [A , B ](x : F [A ]) map (f : A => B ): F [B ]
103- }
96+ end Functor
10497
105- trait Monad [F [_]] extends Functor [F ] {
98+ trait Monad [F [_]] extends Functor [F ] with
10699 def [A , B ](x : F [A ]) flatMap (f : A => F [B ]): F [B ]
107100 def [A , B ](x : F [A ]) map (f : A => B ) = x.flatMap(f `andThen` pure)
108101
109102 def pure [A ](x : A ): F [A ]
110- }
103+ end Monad
111104
112- given ListMonad : Monad [List ] {
105+ given listMonad : Monad [List ] with
113106 def [A , B ](xs : List [A ]) flatMap (f : A => List [B ]): List [B ] =
114107 xs.flatMap(f)
115108 def pure [A ](x : A ): List [A ] =
116109 List (x)
117- }
118110
119- given ReaderMonad [Ctx ] : Monad [[X ] =>> Ctx => X ] {
111+ given readerMonad [Ctx ]: Monad [[X ] =>> Ctx => X ] with
120112 def [A , B ](r : Ctx => A ) flatMap (f : A => Ctx => B ): Ctx => B =
121113 ctx => f(r(ctx))(ctx)
122114 def pure [A ](x : A ): Ctx => A =
123115 ctx => x
124- }
125116
126- def mappAll [F [_]: Monad , T ](x : T , fs : List [T => T ]): F [T ] =
127- fs.foldLeft(implicitly [Monad [F ]].pure(x))((x : F [T ], f : T => T ) =>
128- if ( true ) implicitly [Monad [F ]].map(x)(f)
129- else if ( true ) x.map(f)
117+ def mapAll [F [_]: Monad , T ](x : T , fs : List [T => T ]): F [T ] =
118+ fs.foldLeft(summon [Monad [F ]].pure(x))((x : F [T ], f : T => T ) =>
119+ if true then summon [Monad [F ]].map(x)(f)
120+ else if true then x.map(f)
130121 else x.map[T , T ](f)
131122 )
132123}
0 commit comments