File tree Expand file tree Collapse file tree 2 files changed +63
-0
lines changed Expand file tree Collapse file tree 2 files changed +63
-0
lines changed Original file line number Diff line number Diff line change
1
+ abstract class Source [A ] { self =>
2
+ def consume (a : A ): Int
3
+ def contramap [B ](f : B => A ): Source [B ] = {
4
+ new Source [B ] { // OfClass($anon).outerValue = {OfClass(Source), OfClass($anon)} ???
5
+ override def consume (b : B ) = self.consume(f(b))
6
+ }
7
+ }
8
+ }
9
+
10
+ object O {
11
+ val identity : Source [Int ] = new Source [Int ] {
12
+ override def consume (a : Int ): Int = a
13
+ } // OfClass(Source[A])
14
+ val longToInt : Source [Long ] = identity.contramap((l : Long ) => l.toInt) // longToInt.outer == identity
15
+ val doubleToLongToInt : Source [Double ] = longToInt.contramap((d : Double ) => (d + 2.4 ).toLong) // doubleToLongToInt == longToInt
16
+ // OfClass(Source[Double]).outer = {LocalEnv(contramap)};
17
+ // LocalEnv(contramap).outer = {OfClass(Source[Long]), OfClass(Source[Double])}
18
+ println(doubleToLongToInt.consume(3.5 ))
19
+ }
20
+
Original file line number Diff line number Diff line change
1
+ class A (val x : Int ) {
2
+ class B {
3
+ println(" A.this = " + A .this .hashCode()) // `a`
4
+ println(" A.this.x = " + A .this .x) // B --> outer A (42 or 46)
5
+ def fooz = x
6
+ def fooz2 = x
7
+ class D {
8
+ println(" B.this = " + B .this .hashCode()) // `c` in `foo`
9
+ def bar = fooz // expands to B.this.fooz, calls fooz in class B
10
+ def bar2 = fooz2 // expands to B.this.fooz, calls fooz2 in class C
11
+ }
12
+ }
13
+ }
14
+ class AA (x : Int ) extends A (x) {
15
+ def foo = {
16
+ val a = if true then new A (42 ) else new AA (46 )
17
+ println(" a = " + a.hashCode())
18
+ class C /* outer: AA(44) (`Main.aa`)*/ extends a.B /* outer: A(42) or AA(46) (`a`)*/ {
19
+ println(" AA.this = " + AA .this .hashCode()) // Main.aa
20
+ println(" AA.this.x = " + x) // C --> outer AA --> parent A (44)
21
+ override def fooz2 = x // 44
22
+ }
23
+ val c : C = new C
24
+ println(" c = " + c.hashCode())
25
+ val d = new c.D // outer: C (`c`)
26
+ println(" d.bar = " + d.bar + " , d.bar2 = " + d.bar2)
27
+ d.bar + d.bar2
28
+ }
29
+ }
30
+
31
+ object O {
32
+ val aa = new AA (44 )
33
+ val f = aa.foo
34
+ println(" aa = " + aa.hashCode())
35
+ println(" f = " + f)
36
+ }
37
+
38
+ object Main {
39
+ def main (args : Array [String ]) = {
40
+ O
41
+ ()
42
+ }
43
+ }
You can’t perform that action at this time.
0 commit comments