
Wojtek Narczyński
Hello,
The following code:
{-# LANGUAGE DataKinds #-} {-# LANGUAGE KindSignatures #-}
import Data.ByteString
data CmdKind = GET | SET
class Serialize (cmd :: CmdKind) where serialize :: cmd -> ByteString
Results in the following error:
wojtek@wojtek-desktop:~/src/he/snip$ ghc dk.hs [1 of 1] Compiling Main ( dk.hs, dk.o )
dk.hs:9:17: Expected a type, but ‘cmd’ has kind ‘CmdKind’ In the type ‘cmd -> ByteString’ In the class declaration for ‘Serialize’
Is this so by design, or should I write it in a different way, or is it just not implemented?
As Karl explained, type parameters of (->) need to have kind *, whereas your argument cmd has kind CmdKind. A ``workaround'' to this is using Proxy (or any other type that has something of kind CmdKind as (phantom) type). You can then define something like: import Data.Proxy class Serialize (cmd :: CmdKind) where serialize :: Proxy cmd -> ByteString myByteString = serialize (Proxy :: Proxy GET) Depending on what you are trying to do that may be applicable. Regards, -- - Frank