Functions
This commit is contained in:
parent
d040d76bfa
commit
c8f961abbf
@ -250,11 +250,29 @@ impl<'a> Infer<'a> {
|
|||||||
self.env.extend(name, sigma);
|
self.env.extend(name, sigma);
|
||||||
},
|
},
|
||||||
FuncDecl(Signature { name, params, type_anno }, block) => {
|
FuncDecl(Signature { name, params, type_anno }, block) => {
|
||||||
//TODO fill in here
|
|
||||||
|
|
||||||
|
let mut fn_type_env = TypeEnvironment::default();
|
||||||
|
let mut local_infer = Infer::new(&mut fn_type_env);
|
||||||
|
|
||||||
|
let mut arg_types: Vec<MonoType> = Vec::new();
|
||||||
|
|
||||||
return Err(InferError::Custom(format!("This decl not yet supported")))
|
for (param_name, maybe_type) in params {
|
||||||
|
let tau = local_infer.fresh();
|
||||||
|
let sigma = PolyType(HashSet::new(), tau);
|
||||||
|
local_infer.env.extend(param_name, sigma);
|
||||||
|
}
|
||||||
|
|
||||||
|
let ret_type = local_infer.block(block)?;
|
||||||
|
|
||||||
|
let mut final_type = MonoType::Function(Box::new(MonoType::Const(TypeConst::Unit)), Box::new(ret_type));
|
||||||
|
|
||||||
|
for ty in arg_types.into_iter().rev() {
|
||||||
|
final_type = MonoType::Function(Box::new(ty), Box::new(final_type));
|
||||||
|
}
|
||||||
|
|
||||||
|
let final_ptype = self.generalize(final_type);
|
||||||
|
|
||||||
|
self.env.extend(name, final_ptype);
|
||||||
},
|
},
|
||||||
_ => return Err(InferError::Custom(format!("This decl not yet supported")))
|
_ => return Err(InferError::Custom(format!("This decl not yet supported")))
|
||||||
}
|
}
|
||||||
@ -290,7 +308,7 @@ impl<'a> Infer<'a> {
|
|||||||
let tau = self.instantiate(sigma);
|
let tau = self.instantiate(sigma);
|
||||||
tau
|
tau
|
||||||
},
|
},
|
||||||
_ => return Err(InferError::Custom(format!("this expression type not done yet")))
|
e => return Err(InferError::Custom(format!("this expression type not done yet: {:?}", e)))
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user