diff options
author | Eduardo Julian | 2018-01-04 23:59:40 -0400 |
---|---|---|
committer | Eduardo Julian | 2018-01-04 23:59:40 -0400 |
commit | 303c462daf461c20f41edba3d0921062c8535fda (patch) | |
tree | eb7d4edb5dfbd5af8789a128a4e3deb7eec985b6 /new-luxc/source/luxc/lang/analysis | |
parent | 5c18722100637a61a6e52b4471a2068f37a3dcff (diff) |
- Fixed inference involving existentials.
Diffstat (limited to 'new-luxc/source/luxc/lang/analysis')
-rw-r--r-- | new-luxc/source/luxc/lang/analysis/inference.lux | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/new-luxc/source/luxc/lang/analysis/inference.lux b/new-luxc/source/luxc/lang/analysis/inference.lux index 881eee4a6..3919ff78d 100644 --- a/new-luxc/source/luxc/lang/analysis/inference.lux +++ b/new-luxc/source/luxc/lang/analysis/inference.lux @@ -60,6 +60,17 @@ _ type)) +(def: new-named-type + (Meta Type) + (do macro.Monad<Meta> + [[_module _line _column] macro.cursor + [ex-id exT] (&.with-type-env tc.existential)] + (wrap (#.Primitive (format "{New Type @ " (%t _module) + "," (%n _line) + "," (%n _column) + "} " (%n ex-id)) + (list))))) + ## Type-inference works by applying some (potentially quantified) type ## to a sequence of values. ## Function types are used for this, although inference is not always @@ -87,9 +98,19 @@ (#.ExQ _) (do macro.Monad<Meta> - [[ex-id exT] (&.with-type-env - tc.existential)] - (general analyse (maybe.assume (type.apply (list exT) inferT)) args)) + [[var-id varT] (&.with-type-env tc.var) + output (general analyse + (maybe.assume (type.apply (list varT) inferT)) + args) + bound? (&.with-type-env + (tc.bound? var-id)) + _ (if bound? + (wrap []) + (do @ + [newT new-named-type] + (&.with-type-env + (tc.check varT newT))))] + (wrap output)) (#.Apply inputT transT) (case (type.apply (list inputT) transT) |