Add more infrastructure for unify

This commit is contained in:
greg 2019-02-23 00:59:58 -08:00
parent 00a0de4431
commit be175a2b75

View File

@ -4,7 +4,7 @@ use std::rc::Rc;
// -nope, ghc deliberately does typechecking before desugaring to core // -nope, ghc deliberately does typechecking before desugaring to core
// cf. a history of haskell, peyton-jones // 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::ast::*;
use crate::util::ScopeStack; use crate::util::ScopeStack;
@ -60,13 +60,13 @@ pub enum Type {
pub struct TypeVar(usize); pub struct TypeVar(usize);
impl UnifyKey for TypeVar { impl UnifyKey for TypeVar {
type Value = (); type Value = Option<TypeConst>;
fn index(&self) -> u32 { self.0 as u32 } fn index(&self) -> u32 { self.0 as u32 }
fn from_index(u: u32) -> TypeVar { TypeVar(u as usize) } fn from_index(u: u32) -> TypeVar { TypeVar(u as usize) }
fn tag() -> &'static str { "TypeVar" } fn tag() -> &'static str { "TypeVar" }
} }
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Clone, PartialEq, Eq)]
pub enum TypeConst { pub enum TypeConst {
Unit, Unit,
Nat, Nat,
@ -78,6 +78,8 @@ pub enum TypeConst {
UserDefined UserDefined
} }
impl EqUnifyValue for TypeConst { }
macro_rules! ty { macro_rules! ty {
($type_name:ident) => { Type::Const(TypeConst::$type_name) }; ($type_name:ident) => { Type::Const(TypeConst::$type_name) };
($t1:ident -> $t2:ident) => { Type::Arrow(Box::new(ty!($t1)), Box::new(ty!($t2))) }; ($t1:ident -> $t2:ident) => { Type::Arrow(Box::new(ty!($t1)), Box::new(ty!($t2))) };