Annotating Protocols

clojure.core.typed/ann-protocol annotates protocols.

Takes a name and a optionally a :methods keyword argument mapping method names to expected types.

Protocol definitions should use clojure.core.typed/defprotocol> (identical syntax to defprotocol).

(ann-protocol IUnifyWithLVar
              unify-with-lvar [Term LVar ISubstitutions -> (U ISubstitutions Fail)])

(defprotocol> IUnifyWithLVar
  (unify-with-lvar [v u s]))

Each protocol method argument (including the first) is explicit in the type annotation. Often, the the first argument (aka. this) will just be the protocol, but in some cases it is convenient to add more general types.

Annotating datatypes

clojure.core.typed/ann-datatype annotates datatypes.

Takes a name and a vector of fieldname/type type entries.

(ann-datatype Pair [lhs :- Term
                    rhs :- Term])

(deftype Pair [lhs rhs]
  ...)

Each protocol extended in deftype must have an annotated expected type with ann-protocol.

The types for Java interface method are inferred from their corresponding Java type.