Type families and classes

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

Type families and classes

Alan & Kim Zimmerman
Hi all

I am experimenting with Trees that Grow [1] in the context of the GHC HsSyn AST, and wanting to express that a given extension point needs to have certain properties.

The specific case is to be able to contain a SourceText, in the context of HsLit

So I have (stripped down)

data GHCX

type family XHsString x

type instance XHsString GHCX = SourceText

class HasSourceText a where
  -- Provide setters to mimic existing constructors
  noSourceText  :: a
  sourceText    :: String -> a

  getSourceText :: a -> SourceText

instance HasSourceText (XHsString GHCX) where
  noSourceText    = NoSourceText
  sourceText s    = SourceText s
     getSourceText a = a


But this gives an error

compiler/hsSyn/HsExtension.hs:80:10: error:
    • Illegal type synonym family application in instance:
        XHsString GHCX
    • In the instance declaration for ‘HasSourceText (XHsString GHCX)’

Is there some way to achieve this, or is it simply impossible?

The full work-in-progress source is here[2]

Regards
  Alan

_______________________________________________
ghc-devs mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
Reply | Threaded
Open this post in threaded view
|

Re: Type families and classes

Alan & Kim Zimmerman
And to answer my own question, it seems

instance HasSourceText SourceText where
  noSourceText    = NoSourceText
  sourceText s    = SourceText s
     getSourceText a = a


And then applying the appropriate constraint at the use-site does the job.

So

noSyntaxExpr :: (HasSourceText (XHsString x)) => SyntaxExpr x id

Alan



On 18 May 2017 at 09:04, Alan & Kim Zimmerman <[hidden email]> wrote:
Hi all

I am experimenting with Trees that Grow [1] in the context of the GHC HsSyn AST, and wanting to express that a given extension point needs to have certain properties.

The specific case is to be able to contain a SourceText, in the context of HsLit

So I have (stripped down)

data GHCX

type family XHsString x

type instance XHsString GHCX = SourceText

class HasSourceText a where
  -- Provide setters to mimic existing constructors
  noSourceText  :: a
  sourceText    :: String -> a

  getSourceText :: a -> SourceText

instance HasSourceText (XHsString GHCX) where
  noSourceText    = NoSourceText
  sourceText s    = SourceText s
     getSourceText a = a


But this gives an error

compiler/hsSyn/HsExtension.hs:80:10: error:
    • Illegal type synonym family application in instance:
        XHsString GHCX
    • In the instance declaration for ‘HasSourceText (XHsString GHCX)’

Is there some way to achieve this, or is it simply impossible?

The full work-in-progress source is here[2]

Regards
  Alan


_______________________________________________
ghc-devs mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
Reply | Threaded
Open this post in threaded view
|

RE: Type families and classes

GHC - devs mailing list

Yes that looks right.  A class instance can’t dispatch on a type family application.  In haskell we don’t allow

 

reverse (a ++ b) = reverse a ++ reverse b

 

and it’s the same for type families and class instances.  You should do the type-family reduction yourself, as you do below.

 

Simon

 

From: ghc-devs [mailto:[hidden email]] On Behalf Of Alan & Kim Zimmerman
Sent: 18 May 2017 08:15
To: [hidden email]
Subject: Re: Type families and classes

 

And to answer my own question, it seems

instance HasSourceText SourceText where
  noSourceText    = NoSourceText
  sourceText s    = SourceText s
     getSourceText a = a

And then applying the appropriate constraint at the use-site does the job.

So

noSyntaxExpr :: (HasSourceText (XHsString x)) => SyntaxExpr x id

Alan

 

 

 

On 18 May 2017 at 09:04, Alan & Kim Zimmerman <[hidden email]> wrote:

Hi all

I am experimenting with Trees that Grow [1] in the context of the GHC HsSyn AST, and wanting to express that a given extension point needs to have certain properties.

The specific case is to be able to contain a SourceText, in the context of HsLit

So I have (stripped down)

data GHCX

type family XHsString x

type instance XHsString GHCX = SourceText

class HasSourceText a where
  -- Provide setters to mimic existing constructors
  noSourceText  :: a
  sourceText    :: String -> a

  getSourceText :: a -> SourceText

instance HasSourceText (XHsString GHCX) where
  noSourceText    = NoSourceText
  sourceText s    = SourceText s
     getSourceText a = a

But this gives an error

compiler/hsSyn/HsExtension.hs:80:10: error:
    • Illegal type synonym family application in instance:
        XHsString GHCX
    • In the instance declaration for ‘HasSourceText (XHsString GHCX)’

Is there some way to achieve this, or is it simply impossible?

The full work-in-progress source is here[2]

 

Regards

  Alan

 


_______________________________________________
ghc-devs mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs