Skip to content

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>)
     )
)