summaryrefslogtreecommitdiff
path: root/testsuite/tests/typecheck/should_run/T19667.hs
blob: c3ffa71be8526adfae4996d92417bdbc74de58e3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module Main (main) where

import Data.Proxy (Proxy(..))
import GHC.Exts (withDict)
import GHC.TypeLits (Symbol)
import GHC.Exts

newtype SSymbol (s :: Symbol) = SSymbol String

class KnownSymbol (n :: Symbol) where
  symbolSing :: SSymbol n

symbolVal :: forall n proxy . KnownSymbol n => proxy n -> String
symbolVal _ = case symbolSing :: SSymbol n of SSymbol x -> x

-- See Note [NOINLINE someNatVal] in GHC.TypeNats
{-# NOINLINE reifySymbol #-}
reifySymbol :: forall r. String -> (forall (n :: Symbol). KnownSymbol n => Proxy n -> r) -> r
reifySymbol n k = withDict @(SSymbol Any) @(KnownSymbol Any) (SSymbol n) (k @Any) (Proxy @(Any @Symbol))

main :: IO ()
main = print $ reifySymbol "Hello World" symbolVal