@@ -34,6 +34,10 @@ object Test {
34
34
// println(lift(new Show)(((f: Int => Int) => f(4))((x: Int) => x)))
35
35
// println(lift(new Eval)(((f: Int => Int) => f(4))((x: Int) => x)))
36
36
37
+ println(lift(new Show )(((x : Int ) => Symantics .fix((self : Int => Int ) => ((n : Int ) => if (n <= 0 ) 1 else x * self(n + (- 1 )) )))(3 )(25 )))
38
+ println(lift(new Eval )(((x : Int ) => Symantics .fix((self : Int => Int ) => ((n : Int ) => if (n <= 0 ) 1 else x * self(n + (- 1 )) )))(3 )(5 )))
39
+
40
+
37
41
38
42
}
39
43
@@ -49,11 +53,11 @@ class Show extends Symantics {
49
53
s " (arg $i => ${f(s " arg $i" )}) "
50
54
}
51
55
def app [A , B ](f : Repr [A => B ], arg : Repr [A ]): Repr [B ] = s " $f( $arg) "
52
- def fix [A ]( f : Repr [A ] => Repr [A ]) : Repr [A ] = ???
56
+ def fix [A , B ] : ( Repr [A => B ] => Repr [A => B ]) => Repr [A => B ] = f => f( " FIX " )
53
57
def add (x : Repr [Int ], y : Repr [Int ]): Repr [Int ] = s " $x + $y"
54
58
def mult (x : Repr [Int ], y : Repr [Int ]): Repr [Int ] = s " ( $x) * ( $y) "
55
59
def leq (x : Repr [Int ], y : Repr [Int ]): Repr [Boolean ] = s " $x <= $y"
56
- def ifThenElse [A ](cond : Repr [Boolean ], thenp : Repr [A ], elsep : Repr [A ]): Repr [A ] = s " if ( $cond) $thenp else $elsep"
60
+ def ifThenElse [A ](cond : Repr [Boolean ], thenp : => Repr [A ], elsep : => Repr [A ]): Repr [A ] = s " if ( $cond) $thenp else $elsep"
57
61
58
62
private [this ] var idx : Int = 0
59
63
private def nextIndex (): Int = {
@@ -68,9 +72,13 @@ class Eval extends Symantics {
68
72
def bool (x : Boolean ): Repr [Boolean ] = x
69
73
def lam [A , B ](f : Repr [A ] => Repr [B ]): Repr [A => B ] = f
70
74
def app [A , B ](f : Repr [A => B ], arg : Repr [A ]): Repr [B ] = f(arg)
71
- def fix [A ](f : Repr [A ] => Repr [A ]): Repr [A ] = ???
75
+ def fix [A , B ]: (Repr [A => B ] => Repr [A => B ]) => Repr [A => B ] = f => {
76
+ def self (n : A ): B = f(self)(n)
77
+ self
78
+ }
72
79
def add (x : Repr [Int ], y : Repr [Int ]): Repr [Int ] = x + y
73
80
def mult (x : Repr [Int ], y : Repr [Int ]): Repr [Int ] = x * y
74
81
def leq (x : Repr [Int ], y : Repr [Int ]): Repr [Boolean ] = x <= y
75
- def ifThenElse [A ](cond : Repr [Boolean ], thenp : Repr [A ], elsep : Repr [A ]): Repr [A ] = if (cond) thenp else thenp
82
+ def ifThenElse [A ](cond : Repr [Boolean ], thenp : => Repr [A ], elsep : => Repr [A ]): Repr [A ] = if (cond) thenp else thenp
83
+
76
84
}
0 commit comments