-
Notifications
You must be signed in to change notification settings - Fork 17
zz note: inference predicate type args
David Jeske edited this page May 15, 2017
·
3 revisions
;; the base types all have no arguments
;; base types: 'int 'char 'string 'undefined 'bool 'symbol 'sexp
(type:pred <base type> '())
;; arrow type (arg0 arg1 ... -> result)
(type:pred 'arrow
(list <result type> <arg0> <arg1> ...))
;; record types are called rproduct (not sure why?)
{ RED=int BLUE=string } ;; closed row type
(type:pred 'rproduct (list
(type:pred 'rlabel (list
(type:pred 'RED '()) ;; rlabel1 arg 0 : field name
(type:pred 'pre (list (type:pred 'int '())) ;; rlabel1 arg 1 : field type or tvar
(type:pred 'rlabel (list ;; rlabel1 arg 2 : recurse (rlabel or rdefault)
(type:pred 'BLUE '()) ;; rlabel2 arg 0 : field name
(type:pred 'pre (list (type:pred 'string '())) ;; rlabel2 arg 1 : type or tvar
(type:pred 'rdefault (type:pre 'abs '()))
)
)
)
)
{ RED=int BLUE=string ... } ;; open row type
(type:pred 'rproduct (list
(type:pred 'rlabel (list
(type:pred 'RED '()) ;; rlabel1 arg 0 : field name
(type:pred 'pre (list (type:pred 'int '())) ;; rlabel1 arg 1 : field type or tvar
(type:pred 'rlabel (list ;; rlabel1 arg 2 : recurse (rlabel, rdefault, or tvar)
(type:pred 'BLUE '()) ;; rlabel2 arg 0 : field name
(type:pred 'pre (list (type:pred 'string '())) ;; rlabel2 arg 1 : type or tvar
(type:tvar <number>) ;; rlabel2 arg 2 ; recurse
)
)
)
)
;; variants are sum types, individual cases may contain product-type arguments
|BLUE=int ...| == (rsum (rlabel BLUE (pre int) 'a))
(type:pred 'rsum (list
(type:pred 'rlabel
(type:pred 'BLUE '())
(type:pred 'pre (list (type:pred 'int '()))
(type:tvar <number>)
)
)