packages feed

singletons-base-3.3: tests/compile-and-dump/Singletons/T433.hs

module T433 where

import Data.Kind (Type)
import Data.Singletons.Base.TH
import Prelude.Singletons

$(promote [d|
  konst1 :: a -> Bool -> a
  konst1 x _ = x

  konst2 :: a -> Maybe Bool -> a
  konst2 x _ = x

  f local = g
    where
      g :: forall a. a -> a
      g x = konst1 (x :: a) local

  foo :: forall a. a -> ()
  foo x = const () (Nothing :: Maybe a)

  id2 :: forall a. a -> a
  id2 x = id (x :: a)

  id3 :: a -> a
  id3 (x :: b) = id (x :: b)

  id4 :: forall a. a -> a
  id4 (x :: a) = id (x :: a)

  id5 :: forall a. a -> a
  id5 = g
    where
      g = id :: a -> a

  id6 :: a -> a
  id6 (x :: b) = g
    where
      g = (x :: b)

  id7 (x :: b) = g
    where
      g = (x :: b)

  id8 :: a -> a
  id8 x = g x True
    where
      g :: b -> a -> b
      g y _ = y

  -- These version will not work. See the singletons README for more about these
  -- limitations.

  -- This will not work because the `a` in `forall a` scopes over the body of
  -- the function, but the `(x :: b)` pattern refers to `b` instead of `a`.
  {-
  id9 :: forall a. a -> a
  id9 (x :: b) = id (x :: b)
  -}

  -- This will not work because the `b` in `Nothing :: Maybe b` is bound by the
  -- type signature for `g`, a local variable that closes over `x`. Moreover,
  -- `b` is only mentioned in the return type (and not the arguments) of the
  -- type signature.
  {-
  id10 :: forall a. a -> a
  id10 x = konst2 x y
    where
      y :: forall b. Maybe b
      y = Nothing :: Maybe b
  -}
  |])