typeclasses can have required methods and required functions

This commit is contained in:
ProgramSnail 2023-05-13 16:14:02 +03:00
parent 562541087e
commit 4882d458f8
11 changed files with 113 additions and 43 deletions

View file

@ -5,7 +5,7 @@ basic Char
basic Bool
basic Unit
// bool functions
//
decl not : Bool -> Bool
def not : x =
@ -36,14 +36,14 @@ def ( || ) : x y =
// Eq typeclass
typeclass Eq =
& ( == ) : Eq -> Bool
& ( != ) : Eq -> Bool
& var ( == ) : Eq -> Bool
& var ( != ) : Eq -> Bool
namespace const Eq {
def ( != ) : x = not: (self == x)
def var ( != ) : x = not: (self == x)
}
// Ord typeclass
//
struct Order =
| EQ
@ -51,13 +51,13 @@ struct Order =
| GT
typeclass (Ord : #Eq) =
& compare: Ord -> Order
& ( < ) : Ord -> Bool
& ( >= ) : Ord -> Bool
& ( > ) : Ord -> Bool
& ( <= ) : Ord -> Bool
& min : Ord -> Ord
& max : Ord -> Ord
& var compare: Ord -> Order
& var ( < ) : Ord -> Bool
& var ( >= ) : Ord -> Bool
& var ( > ) : Ord -> Bool
& var ( <= ) : Ord -> Bool
& var min : Ord -> Ord
& var max : Ord -> Ord
namespace var Ord {
def compare : x =
@ -75,23 +75,55 @@ namespace var Ord {
//
typeclass Show =
& show : -> String
& var show : -> String
typeclass Read =
& read : String -> Read
& var read : String -> Read
typeclass Debug =
& debug : -> String
//
typeclass Default =
& default : -> Default
//
// Enum typeclass
typeclass Bounded =
& min_bound : -> Bounded
& max_bound : -> Bounded
& var is_max_bound : -> Bool
& var is_min_bound : -> Bool
//
typeclass Enum =
& succ : Enum -> (Optional Enum)
& pred : Enum -> (Optional Enum)
& var succ : -> (Optional Enum)
& var pred : -> (Optional Enum)
& toEnum : Int -> Enum
& var fromEnum : -> Int
//
// // bad
// typeclass Functor 'A =
// & fmap 'B ('F : (#Functor 'B)) : ('A -> 'B) -> Functor -> 'F
// typeclass (Iterator : #Eq) =
// & next : -> Unit
// & prev : -> Unit
//
// typeclass Iterable ('Iter : #Iterable) =
// & begin : -> 'Iter
// & end : -> 'Iter
//
class Slice ('Elem : ) ('Structure : (#Iterable)) =
//

View file

@ -1,14 +1,14 @@
typeclass Copy =
& copy : Copy -> Copy
typeclass Default =
& default : -> Copy
typeclass (Ord : #Eq) =
& is_less_then : Ord -> Bool
& var is_less_then : Ord -> Bool
typeclass (D : #A #B #C) 'A 'B =
& do_something : -> (& 'A & 'B)
& var do_something : -> (& 'A & 'B)
typeclass E 'A =
& do_something : -> 'A
& var do_something : -> 'A
decl ( == ) ('A : #Ord) : 'A -> 'A -> Bool
def ( == ) : a b = a.is_equal_to: b