Add more infrastructure for unify
This commit is contained in:
parent
00a0de4431
commit
be175a2b75
@ -4,7 +4,7 @@ use std::rc::Rc;
|
||||
// -nope, ghc deliberately does typechecking before desugaring to core
|
||||
// cf. a history of haskell, peyton-jones
|
||||
|
||||
use ena::unify::{UnifyKey, InPlaceUnificationTable, UnificationTable};
|
||||
use ena::unify::{UnifyKey, InPlaceUnificationTable, UnificationTable, EqUnifyValue};
|
||||
|
||||
use crate::ast::*;
|
||||
use crate::util::ScopeStack;
|
||||
@ -60,13 +60,13 @@ pub enum Type {
|
||||
pub struct TypeVar(usize);
|
||||
|
||||
impl UnifyKey for TypeVar {
|
||||
type Value = ();
|
||||
type Value = Option<TypeConst>;
|
||||
fn index(&self) -> u32 { self.0 as u32 }
|
||||
fn from_index(u: u32) -> TypeVar { TypeVar(u as usize) }
|
||||
fn tag() -> &'static str { "TypeVar" }
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq)]
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
pub enum TypeConst {
|
||||
Unit,
|
||||
Nat,
|
||||
@ -78,6 +78,8 @@ pub enum TypeConst {
|
||||
UserDefined
|
||||
}
|
||||
|
||||
impl EqUnifyValue for TypeConst { }
|
||||
|
||||
macro_rules! ty {
|
||||
($type_name:ident) => { Type::Const(TypeConst::$type_name) };
|
||||
($t1:ident -> $t2:ident) => { Type::Arrow(Box::new(ty!($t1)), Box::new(ty!($t2))) };
|
||||
|
Loading…
Reference in New Issue
Block a user