For H-M, add types and some impls

This commit is contained in:
greg 2018-05-17 00:36:51 -07:00
parent 6f639b9030
commit 1de1cd9cfd

View File

@ -1,11 +1,17 @@
use std::rc::Rc; use std::rc::Rc;
use std::collections::{HashSet, HashMap}; use std::collections::{HashSet, HashMap};
use std::collections::hash_set::Union;
use std::iter::Iterator;
//use std::char; //use std::char;
use std::fmt; use std::fmt;
use std::fmt::Write; use std::fmt::Write;
use itertools::Itertools; use itertools::Itertools;
/* GIANT TODO - use the rust im crate, unless I make this code way less haskell-ish after it's done
*/
use parsing; use parsing;
pub struct TypeContext { pub struct TypeContext {
@ -56,9 +62,37 @@ enum TypeConst {
Tuple(Vec<MonoType>), Tuple(Vec<MonoType>),
} }
impl MonoType {
fn free_vars(&self) -> HashSet<Rc<String>> {
use self::MonoType::*;
match self {
Const(_) => HashSet::new(),
Var(a) => {
let mut h = HashSet::new();
h.insert(a.clone());
h
},
Function(a, b) => {
a.free_vars().union(&b.free_vars()).cloned().collect()
},
}
}
}
#[derive(Debug, PartialEq, Clone)] #[derive(Debug, PartialEq, Clone)]
struct PolyType(HashSet<Rc<String>>, MonoType); struct PolyType(HashSet<Rc<String>>, MonoType);
impl PolyType {
fn free_vars(&self) -> HashSet<Rc<String>> {
let mtype = self.1.free_vars();
self.0.difference(&mtype).cloned().collect()
}
}
#[derive(Debug, PartialEq, Clone)]
struct Substitution(HashMap<Rc<String>, MonoType>);
#[derive(Debug, PartialEq, Clone)] #[derive(Debug, PartialEq, Clone)]
pub enum Type { pub enum Type {
Const(TConstOld), Const(TConstOld),
@ -160,11 +194,32 @@ impl TypeContext {
pub fn type_check_ast(&mut self, ast: &parsing::AST) -> TypeResult<String> { pub fn type_check_ast(&mut self, ast: &parsing::AST) -> TypeResult<String> {
let ref block = ast.0; let ref block = ast.0;
//Ok(self.infer_block(block)?) let mut infer = Infer::new();
Ok(format!("Nothin' b/c redoing typechecking")) let output = infer.infer_block(block)?;
Ok(format!("{:?}", output))
} }
} }
// this is the equivalent of the Haskell Infer monad
#[derive(Debug)]
struct Infer {
}
impl Infer {
fn new() -> Infer {
Infer { }
}
fn infer_block(&mut self, block: &Vec<parsing::Statement>) -> TypeResult<MonoType> {
Ok(MonoType::Const(TypeConst::Unit))
}
}
/* /*
impl TypeContext { impl TypeContext {
fn infer_block(&mut self, statements: &Vec<parsing::Statement>) -> TypeResult<Type> { fn infer_block(&mut self, statements: &Vec<parsing::Statement>) -> TypeResult<Type> {