Visible forall in types of terms, Part 1
GHC Proposal #281: Visible forall in types of terms is presented in two parts:
- Part 1 introduces the
forall a ->
quantifier in types of terms but also requires a syntactic marker at use sites. - Part 2 specifies when it is permissible to omit the
type
herald.
This issue is to track the implementation of Part 1 only. Here are a few examples of code that we aim to allow:
-
A variant of
id
that uses visibleforall
:-- Definition: idv :: forall a -> a -> a idv (type a) x = x :: a -- Usage: n = idv (type Double) 42
This is equivalent to
n = (42 :: Double)
. -
A wrapper around
typeRep
that uses visibleforall
:-- Definition: typeRepVis :: forall a -> Typeable a => TypeRep a typeRepVis (type a) = typeRep @a -- Usage: t = typeRepVis (type (Maybe String))
-
A wrapper around
sizeOf
that uses visibleforall
instead ofProxy
:-- Definition: sizeOfVis :: forall a -> Storable a => Int sizeOfVis (type a) = sizeOf (undefined :: a) -- Usage: n = sizeOfVis (type Int)
-
A wrapper around
symbolVal
that uses visibleforall
instead ofProxy
:-- Definition: symbolValVis :: forall s -> KnownSymbol s => String symbolValVis (type s) = symbolVal (Proxy :: Proxy s) -- Usage str = symbolValVis (type "Hello, World")
Edited by Vladislav Zavialov