use let_tvars for the Num, Int, Float, Bool

This commit is contained in:
Folkert 2020-06-23 15:08:23 +02:00
parent c0c4f4c74b
commit 6f1639959a
2 changed files with 156 additions and 168 deletions

View file

@ -44,7 +44,7 @@ const TVAR3: VarId = VarId::from_u32(3);
const FUVAR: VarId = VarId::from_u32(1000); const FUVAR: VarId = VarId::from_u32(1000);
const UVAR1: VarId = VarId::from_u32(1001); const UVAR1: VarId = VarId::from_u32(1001);
const UVAR2: VarId = VarId::from_u32(1002); const UVAR2: VarId = VarId::from_u32(1002);
const UVAR3: VarId = VarId::from_u32(1003); // const UVAR3: VarId = VarId::from_u32(1003);
const UVAR4: VarId = VarId::from_u32(1004); const UVAR4: VarId = VarId::from_u32(1004);
const UVAR5: VarId = VarId::from_u32(1005); const UVAR5: VarId = VarId::from_u32(1005);
const UVAR6: VarId = VarId::from_u32(1006); const UVAR6: VarId = VarId::from_u32(1006);
@ -297,10 +297,8 @@ pub fn types() -> MutMap<Symbol, (SolvedType, Region)> {
// , Attr v (Num (Attr v num)) // , Attr v (Num (Attr v num))
// -> Attr w (Num (Attr w num)) // -> Attr w (Num (Attr w num))
add_type(Symbol::NUM_ADD, { add_type(Symbol::NUM_ADD, {
unique_function( let_tvars! { u, v, w, num };
vec![num_type(UVAR1, TVAR1), num_type(UVAR2, TVAR1)], unique_function(vec![num_type(u, num), num_type(v, num)], num_type(w, num))
num_type(UVAR3, TVAR1),
)
}); });
// sub or (-) : Num a, Num a -> Num a // sub or (-) : Num a, Num a -> Num a
@ -310,61 +308,41 @@ pub fn types() -> MutMap<Symbol, (SolvedType, Region)> {
}); });
// mul or (*) : Num a, Num a -> Num a // mul or (*) : Num a, Num a -> Num a
add_type( add_type(Symbol::NUM_MUL, {
Symbol::NUM_MUL, let_tvars! { u, v, w, num };
unique_function( unique_function(vec![num_type(u, num), num_type(v, num)], num_type(w, num))
vec![num_type(UVAR1, TVAR1), num_type(UVAR2, TVAR1)], });
num_type(UVAR3, TVAR1),
),
);
// abs : Num a -> Num a // abs : Num a -> Num a
add_type( add_type(Symbol::NUM_ABS, {
Symbol::NUM_ABS, let_tvars! { u, v, num };
unique_function(vec![num_type(UVAR1, TVAR1)], num_type(UVAR2, TVAR1)), unique_function(vec![num_type(u, num)], num_type(v, num))
); });
// neg : Num a -> Num a // neg : Num a -> Num a
add_type( add_type(Symbol::NUM_NEG, {
Symbol::NUM_NEG, let_tvars! { u, v, num };
unique_function(vec![num_type(UVAR1, TVAR1)], num_type(UVAR2, TVAR1)), unique_function(vec![num_type(u, num)], num_type(v, num))
); });
let mut add_num_comparison = |symbol| {
add_type(symbol, {
let_tvars! { u, v, w, num };
unique_function(vec![num_type(u, num), num_type(v, num)], bool_type(w))
});
};
// isLt or (<) : Num a, Num a -> Bool // isLt or (<) : Num a, Num a -> Bool
add_type( add_num_comparison(Symbol::NUM_LT);
Symbol::NUM_LT,
unique_function(
vec![num_type(UVAR1, TVAR1), num_type(UVAR2, TVAR1)],
bool_type(UVAR3),
),
);
// isLte or (<=) : Num a, Num a -> Bool // isLte or (<=) : Num a, Num a -> Bool
add_type( add_num_comparison(Symbol::NUM_LTE);
Symbol::NUM_LTE,
unique_function(
vec![num_type(UVAR1, TVAR1), num_type(UVAR2, TVAR1)],
bool_type(UVAR3),
),
);
// isGt or (>) : Num a, Num a -> Bool // isGt or (>) : Num a, Num a -> Bool
add_type( add_num_comparison(Symbol::NUM_GT);
Symbol::NUM_GT,
unique_function(
vec![num_type(UVAR1, TVAR1), num_type(UVAR2, TVAR1)],
bool_type(UVAR3),
),
);
// isGte or (>=) : Num a, Num a -> Bool // isGte or (>=) : Num a, Num a -> Bool
add_type( add_num_comparison(Symbol::NUM_GTE);
Symbol::NUM_GTE,
unique_function(
vec![num_type(UVAR1, TVAR1), num_type(UVAR2, TVAR1)],
bool_type(UVAR3),
),
);
// toFloat : Num a -> Float // toFloat : Num a -> Float
add_type( add_type(
@ -375,42 +353,42 @@ pub fn types() -> MutMap<Symbol, (SolvedType, Region)> {
// Int module // Int module
// isLt or (<) : Num a, Num a -> Bool // isLt or (<) : Num a, Num a -> Bool
add_type( add_type(Symbol::INT_LT, {
Symbol::INT_LT, let_tvars! { u, v, w };
unique_function(vec![int_type(UVAR1), int_type(UVAR2)], bool_type(UVAR3)), unique_function(vec![int_type(u), int_type(v)], bool_type(w))
); });
// equals or (==) : Int, Int -> Bool // equals or (==) : Int, Int -> Bool
add_type( add_type(Symbol::INT_EQ_I64, {
Symbol::INT_EQ_I64, let_tvars! { u, v, w };
unique_function(vec![int_type(UVAR1), int_type(UVAR2)], bool_type(UVAR3)), unique_function(vec![int_type(u), int_type(v)], bool_type(w))
); });
// not equals or (!=) : Int, Int -> Bool // not equals or (!=) : Int, Int -> Bool
add_type( add_type(Symbol::INT_NEQ_I64, {
Symbol::INT_NEQ_I64, let_tvars! { u, v, w };
unique_function(vec![int_type(UVAR1), int_type(UVAR2)], bool_type(UVAR3)), unique_function(vec![int_type(u), int_type(v)], bool_type(w))
); });
// abs : Int -> Int // abs : Int -> Int
add_type( add_type(Symbol::INT_ABS, {
Symbol::INT_ABS, let_tvars! { u, v };
unique_function(vec![int_type(UVAR1)], int_type(UVAR2)), unique_function(vec![int_type(u)], int_type(v))
); });
// rem : Int, Int -> Result Int [ DivByZero ]* // rem : Attr * Int, Attr * Int -> Attr * (Result (Attr * Int) (Attr * [ DivByZero ]*))
add_type( add_type(Symbol::INT_REM, {
Symbol::INT_REM, let_tvars! { star1, star2, star3, star4, star5 };
unique_function( unique_function(
vec![int_type(UVAR1), int_type(UVAR2)], vec![int_type(star1), int_type(star2)],
result_type(UVAR3, int_type(UVAR4), lift(UVAR5, div_by_zero())), result_type(star3, int_type(star4), lift(star5, div_by_zero())),
), )
); });
add_type( add_type(Symbol::INT_REM_UNSAFE, {
Symbol::INT_REM_UNSAFE, let_tvars! { star1, star2, star3, };
unique_function(vec![int_type(UVAR1), int_type(UVAR2)], int_type(UVAR3)), unique_function(vec![int_type(star1), int_type(star2)], int_type(star3))
); });
// highest : Int // highest : Int
add_type(Symbol::INT_HIGHEST, int_type(UVAR1)); add_type(Symbol::INT_HIGHEST, int_type(UVAR1));
@ -419,92 +397,92 @@ pub fn types() -> MutMap<Symbol, (SolvedType, Region)> {
add_type(Symbol::INT_LOWEST, int_type(UVAR1)); add_type(Symbol::INT_LOWEST, int_type(UVAR1));
// div or (//) : Int, Int -> Result Int [ DivByZero ]* // div or (//) : Int, Int -> Result Int [ DivByZero ]*
add_type( add_type(Symbol::INT_DIV, {
Symbol::INT_DIV, let_tvars! { star1, star2, star3, star4, star5 };
unique_function( unique_function(
vec![int_type(UVAR1), int_type(UVAR2)], vec![int_type(star1), int_type(star2)],
result_type(UVAR3, int_type(UVAR4), lift(UVAR5, div_by_zero())), result_type(star3, int_type(star4), lift(star5, div_by_zero())),
), )
); });
add_type( add_type(Symbol::INT_DIV_UNSAFE, {
Symbol::INT_DIV_UNSAFE, let_tvars! { star1, star2, star3, };
unique_function(vec![int_type(UVAR1), int_type(UVAR2)], int_type(UVAR3)), unique_function(vec![int_type(star1), int_type(star2)], int_type(star3))
); });
// mod : Int, Int -> Int // mod : Int, Int -> Int
add_type( add_type(Symbol::INT_MOD, {
Symbol::INT_MOD, let_tvars! { star1, star2, star3, };
unique_function(vec![int_type(UVAR1), int_type(UVAR2)], int_type(UVAR3)), unique_function(vec![int_type(star1), int_type(star2)], int_type(star3))
); });
// Float module // Float module
// isGt or (>) : Num a, Num a -> Bool // isGt or (>) : Num a, Num a -> Bool
add_type( add_type(Symbol::FLOAT_GT, {
Symbol::FLOAT_GT, let_tvars! { star1, star2, star3}
unique_function(vec![float_type(UVAR1), float_type(UVAR2)], bool_type(UVAR3)), unique_function(vec![float_type(star1), float_type(star2)], bool_type(star3))
); });
// eq or (==) : Num a, Num a -> Bool // eq or (==) : Num a, Num a -> Bool
add_type( add_type(Symbol::FLOAT_EQ, {
Symbol::FLOAT_EQ, let_tvars! { star1, star2, star3}
unique_function(vec![float_type(UVAR1), float_type(UVAR2)], bool_type(UVAR3)), unique_function(vec![float_type(star1), float_type(star2)], bool_type(star3))
); });
// div : Float, Float -> Float // div : Float, Float -> Float
add_type( add_type(Symbol::FLOAT_DIV, {
Symbol::FLOAT_DIV, let_tvars! { star1, star2, star3};
unique_function( unique_function(
vec![float_type(UVAR1), float_type(UVAR2)], vec![float_type(star1), float_type(star2)],
float_type(UVAR3), float_type(star3),
), )
); });
// mod : Float, Float -> Float // mod : Float, Float -> Float
add_type( add_type(Symbol::FLOAT_MOD, {
Symbol::FLOAT_MOD, let_tvars! { star1, star2, star3};
unique_function( unique_function(
vec![float_type(UVAR1), float_type(UVAR2)], vec![float_type(star1), float_type(star2)],
float_type(UVAR3), float_type(star3),
), )
); });
// sqrt : Float -> Float
add_type(
Symbol::FLOAT_SQRT,
unique_function(vec![float_type(UVAR1)], float_type(UVAR2)),
);
// round : Float -> Int // round : Float -> Int
add_type( add_type(Symbol::FLOAT_ROUND, {
Symbol::FLOAT_ROUND, let_tvars! { star1, star2 };
unique_function(vec![float_type(UVAR1)], int_type(UVAR2)), unique_function(vec![float_type(star1)], int_type(star2))
); });
// sqrt : Float -> Float
add_type(Symbol::FLOAT_SQRT, {
let_tvars! { star1, star2 };
unique_function(vec![float_type(star1)], float_type(star2))
});
// abs : Float -> Float // abs : Float -> Float
add_type( add_type(Symbol::FLOAT_ABS, {
Symbol::FLOAT_ABS, let_tvars! { star1, star2 };
unique_function(vec![float_type(UVAR1)], float_type(UVAR2)), unique_function(vec![float_type(star1)], float_type(star2))
); });
// sin : Float -> Float // sin : Float -> Float
add_type( add_type(Symbol::FLOAT_SIN, {
Symbol::FLOAT_SIN, let_tvars! { star1, star2 };
unique_function(vec![float_type(UVAR1)], float_type(UVAR2)), unique_function(vec![float_type(star1)], float_type(star2))
); });
// cos : Float -> Float // cos : Float -> Float
add_type( add_type(Symbol::FLOAT_COS, {
Symbol::FLOAT_COS, let_tvars! { star1, star2 };
unique_function(vec![float_type(UVAR1)], float_type(UVAR2)), unique_function(vec![float_type(star1)], float_type(star2))
); });
// tan : Float -> Float // tan : Float -> Float
add_type( add_type(Symbol::FLOAT_TAN, {
Symbol::FLOAT_TAN, let_tvars! { star1, star2 };
unique_function(vec![float_type(UVAR1)], float_type(UVAR2)), unique_function(vec![float_type(star1)], float_type(star2))
); });
// highest : Float // highest : Float
add_type(Symbol::FLOAT_HIGHEST, float_type(UVAR1)); add_type(Symbol::FLOAT_HIGHEST, float_type(UVAR1));
@ -514,41 +492,47 @@ pub fn types() -> MutMap<Symbol, (SolvedType, Region)> {
// Bool module // Bool module
// isEq or (==) : a, a -> Attr u Bool // isEq or (==) : Attr * a, Attr * a -> Attr * Bool
add_type( add_type(Symbol::BOOL_EQ, {
Symbol::BOOL_EQ, let_tvars! { star1, star2, star3, a };
unique_function(vec![flex(TVAR1), flex(TVAR1)], bool_type(UVAR3)), unique_function(
); vec![attr_type(star1, a), attr_type(star2, a)],
bool_type(star3),
)
});
// isNeq or (!=) : a, a -> Attr u Bool // isNeq or (!=) : Attr * a, Attr * a -> Attr * Bool
add_type( add_type(Symbol::BOOL_NEQ, {
Symbol::BOOL_NEQ, let_tvars! { star1, star2, star3, a };
unique_function(vec![flex(TVAR1), flex(TVAR1)], bool_type(UVAR3)), unique_function(
); vec![attr_type(star1, a), attr_type(star2, a)],
bool_type(star3),
)
});
// and or (&&) : Attr u1 Bool, Attr u2 Bool -> Attr u3 Bool // and or (&&) : Attr u1 Bool, Attr u2 Bool -> Attr u3 Bool
add_type( add_type(Symbol::BOOL_AND, {
Symbol::BOOL_AND, let_tvars! { star1, star2, star3};
unique_function(vec![bool_type(UVAR1), bool_type(UVAR2)], bool_type(UVAR3)), unique_function(vec![bool_type(star1), bool_type(star2)], bool_type(star3))
); });
// or or (||) : Attr u1 Bool, Attr u2 Bool -> Attr u3 Bool // or or (||) : Attr u1 Bool, Attr u2 Bool -> Attr u3 Bool
add_type( add_type(Symbol::BOOL_OR, {
Symbol::BOOL_OR, let_tvars! { star1, star2, star3};
unique_function(vec![bool_type(UVAR1), bool_type(UVAR2)], bool_type(UVAR3)), unique_function(vec![bool_type(star1), bool_type(star2)], bool_type(star3))
); });
// xor : Attr u1 Bool, Attr u2 Bool -> Attr u3 Bool // xor : Attr u1 Bool, Attr u2 Bool -> Attr u3 Bool
add_type( add_type(Symbol::BOOL_XOR, {
Symbol::BOOL_XOR, let_tvars! { star1, star2, star3};
unique_function(vec![bool_type(UVAR1), bool_type(UVAR2)], bool_type(UVAR3)), unique_function(vec![bool_type(star1), bool_type(star2)], bool_type(star3))
); });
// not : Attr u1 Bool -> Attr u2 Bool // not : Attr u1 Bool -> Attr u2 Bool
add_type( add_type(Symbol::BOOL_NOT, {
Symbol::BOOL_NOT, let_tvars! { star1, star2 };
unique_function(vec![bool_type(UVAR1)], bool_type(UVAR2)), unique_function(vec![bool_type(star1)], bool_type(star2))
); });
// List module // List module

View file

@ -2402,14 +2402,18 @@ mod test_uniq_solve {
} }
#[test] #[test]
fn equals() { fn bool_eq() {
infer_eq( infer_eq(
indoc!( "\\a, b -> a == b",
r#" "Attr * (Attr * a, Attr * a -> Attr * Bool)",
\a, b -> a == b );
"# }
),
"Attr * (a, a -> Attr * Bool)", #[test]
fn bool_neq() {
infer_eq(
"\\a, b -> a != b",
"Attr * (Attr * a, Attr * a -> Attr * Bool)",
); );
} }