mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-01 15:51:12 +00:00
use let_tvars for the Num, Int, Float, Bool
This commit is contained in:
parent
c0c4f4c74b
commit
6f1639959a
2 changed files with 156 additions and 168 deletions
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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)",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue