::
9.0
top
← prev up next →

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

syntax

( :: idmaybe-polymorphicfunction-type)

maybe-polymorphic =
| type-var-id...=>
function-type = arg-type...maybe-optmaybe-rest->function-type
| arg-type...maybe-optmayberest->result-type
maybe-opt =
| + arg-type...
maybe-rest =
| * arg-type
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:
> (:: identA=> A->A)
> (define (identa)a)
> (:print-typeident)

(All (A) (-> A A))

> (ident10)

- : Integer [more precisely: Positive-Byte]

10

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)
> (define ((first-valuea)b)a)
> (:print-typefirst-value)

(All (A) (-> A (All (B) (-> B A))))

> ((first-value'foo)20)

- : 'foo

'foo

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"])
(string-append greeting" "name))
> (:print-typegreet)

(->* (String) (String) String)

> (greet"John")

- : String

"Hello John"

> (greet"Jack""Hey")

- : String

"Hey Jack"

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)
(apply string-append (map a->stringas)))
> (:print-typeappend-as-string)

(All (A) (-> (-> A String) A * String))

> (append-as-stringnumber->string 12345)

- : String

"12345"

top
← prev up next →

AltStyle γ«γ‚ˆγ£γ¦ε€‰ζ›γ•γ‚ŒγŸγƒšγƒΌγ‚Έ (->γ‚ͺγƒͺγ‚ΈγƒŠγƒ«) /