Overload the static form to reduce verbosity.
authorFacundo Domínguez <facundo.dominguez@tweag.io>
Thu, 25 Feb 2016 13:33:43 +0000 (14:33 +0100)
committerBen Gamari <ben@smart-cactus.org>
Thu, 25 Feb 2016 14:41:28 +0000 (15:41 +0100)
commitc1efdcc40209bc4f0ded85269eb8ba49c7d1ff09
tree41ae9ba115d2540b7fa80cd7146ce7efbbc34eeb
parent009a99979437314a4cefa07b55a80fd13ea07c8c
Overload the static form to reduce verbosity.

Static pointers are rarely used naked: most often they are defined at
the base of a Closure, as defined in e.g. the distributed-closure and
distributed-static packages. So a typical usage pattern is:

    distributeMap (closure (static (\x -> x * 2)))

which is more verbose than it needs to be. Ideally we'd just have to
write

    distributeMap (static (\x -> x * 2))

and let the static pointer be lifted to a Closure implicitly. i.e.
what we want is to overload static literals, just like we already
overload list literals and string literals.

This is achieved by introducing the IsStatic type class and changing
the typing rule for static forms slightly:

    static (e :: t) :: IsStatic p => p t

Test Plan: ./validate

Reviewers: austin, hvr, bgamari

Reviewed By: bgamari

Subscribers: simonpj, mboes, thomie

Differential Revision: https://phabricator.haskell.org/D1923

GHC Trac Issues: #11585
compiler/prelude/PrelNames.hs
compiler/typecheck/TcExpr.hs
docs/users_guide/glasgow_exts.rst
libraries/base/GHC/StaticPtr.hs