Compact Annotationsπ i
This library provides a more convenient syntax for writing typed racket
polymorphic and curried functions. It is very similar to Haskell type
annotations.
source code: https://github.com/jackfirth/compact-annotations
( :: idmaybe-polymorphicfunction-type)
maybe-polymorphic =
function-type = arg-type...maybe-optmaybe-rest->function-type
| arg-type...maybe-optmayberest->result-type
maybe-opt =
maybe-rest =
Declares that
id has the type determined by
function-type,
which may be a parametric type over
type-var-id... if provided.
The syntax of
function-type allows for partially applied function
types, optional argument types, and rest argument types.
With this syntax, the type of the identity function can be defined as follows:
Examples:
> (:print-typeident)
> (ident10)
- : Integer [more precisely: Positive-Byte]
A function that takes one value and returns a function that takes another value
and ignores it, returning the first value can have it’s type defined as follows:
Examples:
> (:: first-valueAB=> A->B->A) > (:print-typefirst-value)
(All (A) (-> A (All (B) (-> B A))))
> ((first-value'foo)20)
Optional arguments can have their type specified with a
+ . For example,
a function that greets people with "Hello" by default can have it’s type defined
as follows:
Examples:
> (:: greetString+ String->String) > (define (greetname[greeting"Hello"]) > (:print-typegreet)
(->* (String) (String) String)
> (greet"John")
> (greet"Jack""Hey")
Rest arguments can also have their type specified with a
* . A function
that converts it’s arguments from one type to String then appends them all
can have its type specified as follows:
Examples:
> (:: append-as-stringA=> (A->String)* A->String) > (define (append-as-stringa->string. as) > (:print-typeappend-as-string)
(All (A) (-> (-> A String) A * String))