Skip to content

Visible forall in types of terms, Part 1

GHC Proposal #281: Visible forall in types of terms is presented in two parts:

  1. Part 1 introduces the forall a -> quantifier in types of terms but also requires a syntactic marker at use sites.
  2. 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 visible forall:

    -- 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 visible forall:

    -- 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 visible forall instead of Proxy:

    -- Definition:
    sizeOfVis :: forall a -> Storable a => Int
    sizeOfVis (type a) = sizeOf (undefined :: a)
    
    -- Usage:
    n = sizeOfVis (type Int)
  • A wrapper around symbolVal that uses visible forall instead of Proxy:

    -- Definition:
    symbolValVis :: forall s -> KnownSymbol s => String
    symbolValVis (type s) = symbolVal (Proxy :: Proxy s)
    
    -- Usage
    str = symbolValVis (type "Hello, World")
Edited by Vladislav Zavialov
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information