basic (Float : #Ord #Div #Str) basic (Int : #Ord #IDiv #Str) basic (String : #Ord #Str #CharContainer #Copy) basic (Char : #Ord #Str #Copy) basic (Bool : #Ord #Str #Copy) basic (Unit : #Str #Copy) // decl not : Bool -> Bool def not : x = (match x with | true -> false | false -> true) decl ( && ) : Bool -> Bool -> Bool def ( && ) : x y = match x with | true -> ( match y with | true -> true | false -> false ) | false -> false decl ( || ) : Bool -> Bool -> Bool def ( || ) : x y = match x with | true -> true | false -> ( match y with | true -> true | false -> false ) // typeclass CharContainer = & var size : -> Int & var at : Int -> Char // typeclass Move = // TODO & var ( <- ) : Move -> Unit typeclass Copy = & var ( = ) : Copy -> Unit // typeclass (Sum : #Copy) = & var ( += ) : Sum -> Unit & var ( -= ) : Sum -> Unit & var ( + ) : Sum -> Sum & var ( - ) : Sum -> Sum & zero : -> Sum namespace var Sum { def ( + ) : x = { var ans = self ; ans += x return ans } def ( - ) : x = { var ans = self ; ans -= x return ans } } typeclass (Mult : #Sum) = & var ( *= ) : Mult -> Unit & var ( * ) : Mult -> Mult namespace var Mult { def ( * ) : x = { var ans = self ; ans *= x return ans } } typeclass (IDiv : #Mult) = & var div : IDiv -> IDiv & var mod : IDiv -> IDiv namespace var IDiv { def mod : x = self -. x * self.div: x } typeclass (Div : #Mult) = & var ( /= ) : Div -> Unit & var ( / ) : Div -> Div namespace var Div { def ( / ) : x = { var ans = self ; ans /= x return ans } } // typeclass Eq = & var ( == ) : Eq -> Bool & var ( != ) : Eq -> Bool namespace var Eq { def ( != ) : x = not: (self == x) } // struct Order = | EQ | LT | GT typeclass (Ord : #Eq) = & var compare : Ord -> Order & var ( < ) : Ord -> Bool & var ( >= ) : Ord -> Bool & var ( > ) : Ord -> Bool & var ( <= ) : Ord -> Bool decl min ('A : #Ord) : 'A -> 'A -> 'A def min : x y = if x < y then x else y decl max ('A : #Ord) : 'A -> 'A -> 'A def max : x y = if x < y then y else x namespace var Ord { def compare : x = if self == x then $EQ elif self < x then $LT else $GT def ( >= ) : x = not: (self < x) def ( > ) : x = x < self def ( <= ) : x = not: (x < self) } // typeclass Show = & var show : -> String typeclass Read = & read : String -> Read typeclass (Str : #Show #Read) // typeclass DebugShow = // TODO // & debug_show : -> String // typeclass Default = & default : -> Default // typeclass Bounded = & min_bound : -> Bounded & max_bound : -> Bounded & var is_max_bound : -> Bool & var is_min_bound : -> Bool // typeclass Enum = & var succ : -> (Optional Enum) & var pred : -> (Optional Enum) & to_enum : Int -> Enum & var from_enum : -> Int // namespace IO { decl print : String -> Unit decl scan : -> String decl random : -> Int // TODO } //