Symbols behave exactly like Strings at the type-level. Imagining a future where PureScript has datatype-promotion with potentially function promotion as well (much like the singletons library for Haskell), the fact that these are called differently will likely cause issues, or at least confusion.
What this means in Haskell today, is that data-types that use either Symbol or String can only be used at their respected levels. In other words, Symbols can only be promoted, and Strings must be values. The following snippet demonstrates the issue:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE PolyKinds #-}
module SymbolString where
import GHC.TypeLits
data D1 = D1 String
data D2 = D2 Symbol
data Proxy (a :: k) = Proxy
d1 :: D1
d1 = D1 "foo"
-- Doesn't work:
--d1' :: Proxy ('D1 "foo")
--d1' = Proxy
--
-- • Expected kind ‘String’, but ‘"foo"’ has kind ‘Symbol’
d2 :: Proxy ('D2 "foo")
d2 = Proxy
'D1 has no type-level inhabitants, and D2 has no value-level inhabitants. singletons solves this issue by special-casing String, but I think that's not very elegant.
If datatype-promotion is a planned feature, then I think renaming Symbol to String would make sense sooner rather than later.
Because this would break a lot of existing code, maybe some temporary kind synonym can be introduced that throws a warning?
Symbols behave exactly likeStrings at the type-level. Imagining a future where PureScript has datatype-promotion with potentially function promotion as well (much like thesingletonslibrary for Haskell), the fact that these are called differently will likely cause issues, or at least confusion.What this means in Haskell today, is that data-types that use either
SymbolorStringcan only be used at their respected levels. In other words,Symbols can only be promoted, andStrings must be values. The following snippet demonstrates the issue:{-# LANGUAGE DataKinds #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE PolyKinds #-} module SymbolString where import GHC.TypeLits data D1 = D1 String data D2 = D2 Symbol data Proxy (a :: k) = Proxy d1 :: D1 d1 = D1 "foo" -- Doesn't work: --d1' :: Proxy ('D1 "foo") --d1' = Proxy -- -- • Expected kind ‘String’, but ‘"foo"’ has kind ‘Symbol’ d2 :: Proxy ('D2 "foo") d2 = Proxy'D1has no type-level inhabitants, andD2has no value-level inhabitants.singletonssolves this issue by special-casingString, but I think that's not very elegant.If datatype-promotion is a planned feature, then I think renaming
SymboltoStringwould make sense sooner rather than later.Because this would break a lot of existing code, maybe some temporary kind synonym can be introduced that throws a warning?