{-# LANGUAGE NoImplicitPrelude #-}
-- declarations of builtin functions and data types used by the compiler
module Internals where
-- used for type annotations
typeAnn x = x
undefined :: forall (a :: Type) . a
primFix :: forall (a :: Type) . (a -> a) -> a
data Unit = TT
data String
data Empty (a :: String)
-- TODO: generate?
data Tuple0 = Tuple0
data Tuple1 a = Tuple1 a
data Tuple2 a b = Tuple2 a b
data Tuple3 a b c = Tuple3 a b c
data Tuple4 a b c d = Tuple4 a b c d
data Tuple5 a b c d e = Tuple5 a b c d e
-- ... TODO
-- builtin used for overlapping instances
parEval :: forall a -> a -> a -> a
type family JoinTupleType t1 t2 where
-- TODO
JoinTupleType a () = a
JoinTupleType a (b, c) = (a, b, c)
JoinTupleType a (b, c, d) = (a, b, c, d)
JoinTupleType a (b, c, d, e) = (a, b, c, d, e)
JoinTupleType a b = (a, b)
-- conjuction of constraints
type family T2 a b
-- equality constraints
type family EqCT (t :: Type) (a :: t) (b :: t)
type EqCTt = EqCT Type
--type instance EqCT t (a, b) (JoinTupleType a' b') = T2 (EqCT Type a a') (EqCT Type b b')
-- builtin conjuction of constraint witnesses
t2C :: Unit -> Unit -> Unit
-- builtin type constructors
data Int
data Word
data Float
data Char
data Bool = False | True
data Ordering = LT | EQ | GT
data Nat = Zero | Succ Nat
-- builtin primitives
primIntToWord :: Int -> Word
primIntToFloat :: Int -> Float
primIntToNat :: Int -> Nat
primCompareInt :: Int -> Int -> Ordering
primCompareWord :: Word -> Word -> Ordering
primCompareFloat :: Float -> Float -> Ordering
primCompareChar :: Char -> Char -> Ordering
primCompareString :: String -> String -> Ordering
primNegateInt :: Int -> Int
primNegateWord :: Word -> Word
primNegateFloat :: Float -> Float
primAddInt :: Int -> Int -> Int
primSubInt :: Int -> Int -> Int
primModInt :: Int -> Int -> Int
primSqrtFloat :: Float -> Float
primRound :: Float -> Int
primIfThenElse :: Bool -> a -> a -> a
primIfThenElse True a b = a
primIfThenElse False a b = b
isEQ EQ = True
isEQ _ = False
-- fromInt is needed for integer literal
class Num a where
fromInt :: Int -> a
compare :: a -> a -> Ordering
negate :: a -> a
instance Num Int where
fromInt = \x -> x
compare = primCompareInt
negate = primNegateInt
instance Num Word where
fromInt = primIntToWord
compare = primCompareWord
negate = primNegateWord
instance Num Float where
fromInt = primIntToFloat
compare = primCompareFloat
negate = primNegateFloat
instance Num Nat where
fromInt = primIntToNat --if isEQ (primCompareInt n zero') then Zero else Succ (fromInt (primSubInt n one'))
compare = undefined
negate = undefined
class Eq a where
(==) :: a -> a -> Bool -- todo: use (==) sign
infix 4 ==
instance Eq String where a == b = isEQ (primCompareString a b)
instance Eq Char where a == b = isEQ (primCompareChar a b)
instance Eq Int where a == b = isEQ (primCompareInt a b)
instance Eq Float where a == b = isEQ (primCompareFloat a b)
instance Eq Bool where
True == True = True
False == False = True
_ == _ = False
instance Eq Nat where
Zero == Zero = True
Succ a == Succ b = a == b
_ == _ = False
data List a = Nil | Cons a (List a)
infixr 5 :