aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lux/analyser/lux.clj3
-rw-r--r--src/lux/type.clj15
2 files changed, 13 insertions, 5 deletions
diff --git a/src/lux/analyser/lux.clj b/src/lux/analyser/lux.clj
index c9244a91e..1761ec1a2 100644
--- a/src/lux/analyser/lux.clj
+++ b/src/lux/analyser/lux.clj
@@ -267,7 +267,8 @@
[["lux;VarT" ?id]]
(|do [? (&type/bound? ?id)]
(if ?
- (fail "[Analyser Error] Can't use type-var in any type-specific way inside polymorphic functions.")
+ (|do [dtype (&type/deref ?id)]
+ (fail (str "[Analyser Error] Can't use type-var in any type-specific way inside polymorphic functions: " ?id (&type/show-type dtype))))
(return output)))))))
[_]
diff --git a/src/lux/type.clj b/src/lux/type.clj
index 82a405977..dcaf0bf5e 100644
--- a/src/lux/type.clj
+++ b/src/lux/type.clj
@@ -138,10 +138,17 @@
(defn bound? [id]
(fn [state]
- (if-let [type* (->> state (&/get$ &/$TYPES) (&/get$ &/$MAPPINGS) (&/|get id))]
- (matchv ::M/objects [type*]
- [["lux;Some" _]]
- (return* state true)
+ (if-let [type (->> state (&/get$ &/$TYPES) (&/get$ &/$MAPPINGS) (&/|get id))]
+ (matchv ::M/objects [type]
+ [["lux;Some" type*]]
+ (matchv ::M/objects [type*]
+ [["lux;VarT" ?id]]
+ (&/run-state (&/try-all% (&/|list (bound? ?id)
+ (return false)))
+ state)
+
+ [_]
+ (return* state true))
[["lux;None" _]]
(return* state false))