aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/lux.lux7
-rw-r--r--src/lux/analyser/lux.clj3
-rw-r--r--src/lux/type.clj15
3 files changed, 17 insertions, 8 deletions
diff --git a/source/lux.lux b/source/lux.lux
index 19a89c8ee..c5a532a2a 100644
--- a/source/lux.lux
+++ b/source/lux.lux
@@ -516,9 +516,10 @@
(fold f (f init x) xs')))
(def (reverse' list)
- (->' ($' List Syntax) ($' List Syntax))
- (fold (:' (->' ($' List Syntax) Syntax
- ($' List Syntax))
+ (All' [a]
+ (->' ($' List (B' a)) ($' List (B' a))))
+ (fold (:' (All' [a]
+ (->' ($' List (B' a)) (B' a) ($' List (B' a))))
(lambda [tail head]
(#Cons [head tail])))
#Nil
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))