Below is the code we used in class.
In the cslab, it can also be found in /cslab/class/cs243/recurtypes2.ml
.
datatype wholeNumber = Zero | OnePlus of wholeNumber; fun succ(num) = OnePlus(num); fun asWholeNumber(0) = Zero | asWholeNumber(n) = OnePlus(asWholeNumber(n-1)); fun pred(OnePlus(num)) = num; fun plus(Zero , num) = num | plus(num, Zero) = num | plus(OnePlus(num1), OnePlus(num2)) = plus( num1 , OnePlus(OnePlus(num2))); fun isLessThanOrEq(Zero, num) = true | isLessThanOrEq(num, Zero) = false | isLessThanOrEq(OnePlus(num1), OnePlus(num2)) = isLessThanOrEq(num1, num2); fun isLessThan(num, Zero) = false | isLessThan(Zero, num) = true | isLessThan(OnePlus(num1), OnePlus(num2)) = isLessThan(num1, num2); fun asInt(Zero) = 0 | asInt(OnePlus(num)) = 1 + asInt(num); fun times(Zero, num) = Zero | times(num, Zero) = Zero | times(OnePlus(num1), num3) = plus(num3, times(num1, num3));