For H-M, add types and some impls
This commit is contained in:
parent
6f639b9030
commit
1de1cd9cfd
@ -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> {
|
||||||
|
Loading…
Reference in New Issue
Block a user