RE: Broken Data.Data instances

2014-07-27 Thread p.k.f.holzenspies
Alan,

In that case, let's have a short feedback-loop between the two of us. It seems 
many of these files (Name.lhs, for example) are really stable through the 
repo-history. It would be nice to have one bigger refactoring all in one go 
(some of the code could use a polish, a lot of code seems removable).

Regards,
Philip


Van: Alan  Kim Zimmerman [alan.z...@gmail.com]
Verzonden: vrijdag 25 juli 2014 13:44
Aan: Simon Peyton Jones
CC: Holzenspies, P.K.F. (EWI); ghc-devs@haskell.org
Onderwerp: Re: Broken Data.Data instances

By the way, I would be happy to attempt this task, if the concept is viable.


On Thu, Jul 24, 2014 at 11:23 PM, Alan  Kim Zimmerman 
alan.z...@gmail.commailto:alan.z...@gmail.com wrote:
While we are talking about fixing traversals, how about getting rid of the 
phase specific panic initialisers for placeHolderType, placeHolderKind and 
friends?

In order to safely traverse with SYB, the following needs to be inserted into 
all the SYB schemes (see
https://github.com/alanz/HaRe/blob/master/src/Language/Haskell/Refact/Utils/GhcUtils.hs)

-- Check the Typeable items
checkItemStage1 :: (Typeable a) = SYB.Stage - a - Bool
checkItemStage1 stage x = (const False `SYB.extQ` postTcType `SYB.extQ` fixity 
`SYB.extQ` nameSet) x
  where nameSet = const (stage `elem` [SYB.Parser,SYB.TypeChecker]) :: 
GHC.NameSet   - Bool
postTcType  = const (stage  SYB.TypeChecker  ) :: 
GHC.PostTcType- Bool
fixity  = const (stage  SYB.Renamer  ) :: 
GHC.Fixity- Bool

And in addition HsCmdTop and ParStmtBlock are initialised with explicit 
'undefined values.

Perhaps use an initialiser that can have its panic turned off when called via 
the GHC API?

Regards
  Alan



On Thu, Jul 24, 2014 at 11:06 PM, Simon Peyton Jones 
simo...@microsoft.commailto:simo...@microsoft.com wrote:
So... does anyone object to me changing these broken instances with the ones 
given by DeriveDataTypeable?

That’s fine with me provided (a) the default behaviour is not immediate 
divergence (which it might well be), and (b) the pitfalls are documented.

Simon

From: Philip K.F. Hölzenspies 
[mailto:p.k.f.holzensp...@utwente.nlmailto:p.k.f.holzensp...@utwente.nl]
Sent: 24 July 2014 18:42
To: Simon Peyton Jones
Cc: ghc-devs@haskell.orgmailto:ghc-devs@haskell.org
Subject: Re: Broken Data.Data instances

Dear Simon, et al,

These are very good points to make for people writing such traversals and 
queries. I would be more than happy to write a page on the pitfalls etc. on the 
wiki, but in my experience so far, exploring the innards of GHC is tremendously 
helped by trying small things out and showing (bits of) the intermediate 
structures. For me, personally, this has always been hindered by the absence of 
good instances of Data and/or Show (not having to bring DynFlags and not just 
visualising with the pretty printer are very helpful).

So... does anyone object to me changing these broken instances with the ones 
given by DeriveDataTypeable?

Also, many of these internal data structures could be provided with useful 
lenses to improve such traversals further. Anyone ever go at that? Would be 
people be interested?

Regards,
Philip


[cid:image001.jpg@01CFA78B.7D356DE0]
Simon Peyton Jonesmailto:simo...@microsoft.com
24 Jul 2014 18:22
GHC’s data structures are often mutually recursive. e.g.

•The TyCon for Maybe contains the DataCon for Just

•The DataCon For just contains Just’s type

•Just’s type contains the TyCon for Maybe

So any attempt to recursively walk over all these structures, as you would a 
tree, will fail.

Also there’s a lot of sharing.  For example, every occurrence of ‘map’ is a 
Var, and inside that Var is map’s type, its strictness, its rewrite RULE, etc 
etc.  In walking over a term you may not want to walk over all that stuff at 
every occurrence of map.

Maybe that’s it; I’m not certain since I did not write the Data instances for 
any of GHC’s types

Simon

From: ghc-devs [mailto:ghc-devs-boun...@haskell.org] On Behalf Of 
p.k.f.holzensp...@utwente.nlmailto:p.k.f.holzensp...@utwente.nl
Sent: 24 July 2014 16:42
To: ghc-devs@haskell.orgmailto:ghc-devs@haskell.org
Subject: Broken Data.Data instances

Dear GHC-ers,

Is there a reason for explicitly broken Data.Data instances? Case in point:

 instance Data Var where
   -- don't traverse?
   toConstr _   = abstractConstr Var
   gunfold _ _  = error gunfold
   dataTypeOf _ = mkNoRepType Var

I understand (vaguely) arguments about abstract data types, but this also 
excludes convenient queries that can, e.g. extract all types from a CoreExpr. I 
had hoped to do stuff like this:

 collect :: (Typeable b, Data a, MonadPlus m) = a - m b
 collect = everything mplus $ mkQ mzero return

 allTypes :: CoreExpr - [Type]
 allTypes = collect

Especially when still exploring (parts of) the GHC API, being able to extract 
things in this fashion is very 

Re: Broken Data.Data instances

2014-07-27 Thread Alan Kim Zimmerman
My intention would be to simply change the placeholders into something that
would not blow up during a normal traversal, preferably something that
still gives the required behaviour when invoked normally by GHC, to
indicate a bug that needs fixing, but that can somehow be turned off at
other tiimes.

I am open to suggestions as to a mechanism  that can achieve this, I
thought of some kind of setting via Dynamic Flags.


Alan


On Sun, Jul 27, 2014 at 4:17 PM, p.k.f.holzensp...@utwente.nl wrote:

  Alan,

 In that case, let's have a short feedback-loop between the two of us. It
 seems many of these files (Name.lhs, for example) are really stable through
 the repo-history. It would be nice to have one bigger refactoring all in
 one go (some of the code could use a polish, a lot of code seems removable).

 Regards,
 Philip

  --
 *Van:* Alan  Kim Zimmerman [alan.z...@gmail.com]
 *Verzonden:* vrijdag 25 juli 2014 13:44
 *Aan:* Simon Peyton Jones
 *CC:* Holzenspies, P.K.F. (EWI); ghc-devs@haskell.org
 *Onderwerp:* Re: Broken Data.Data instances

   By the way, I would be happy to attempt this task, if the concept is
 viable.


 On Thu, Jul 24, 2014 at 11:23 PM, Alan  Kim Zimmerman 
 alan.z...@gmail.com wrote:

While we are talking about fixing traversals, how about getting rid
 of the phase specific panic initialisers for placeHolderType,
 placeHolderKind and friends?

  In order to safely traverse with SYB, the following needs to be inserted
 into all the SYB schemes (see

 https://github.com/alanz/HaRe/blob/master/src/Language/Haskell/Refact/Utils/GhcUtils.hs
 )

 -- Check the Typeable items
 checkItemStage1 :: (Typeable a) = SYB.Stage - a - Bool
 checkItemStage1 stage x = (const False `SYB.extQ` postTcType `SYB.extQ`
 fixity `SYB.extQ` nameSet) x
   where nameSet = const (stage `elem` [SYB.Parser,SYB.TypeChecker])
 :: GHC.NameSet   - Bool
 postTcType  = const (stage  SYB.TypeChecker  )
 :: GHC.PostTcType- Bool
 fixity  = const (stage  SYB.Renamer  )
 :: GHC.Fixity- Bool

  And in addition HsCmdTop and ParStmtBlock are initialised with explicit
 'undefined values.

  Perhaps use an initialiser that can have its panic turned off when
 called via the GHC API?

  Regards
Alan



  On Thu, Jul 24, 2014 at 11:06 PM, Simon Peyton Jones 
 simo...@microsoft.com wrote:

So... does anyone object to me changing these broken instances
 with the ones given by DeriveDataTypeable?

  That’s fine with me provided (a) the default behaviour is not
 immediate divergence (which it might well be), and (b) the pitfalls are
 documented.



 Simon



 *From:* Philip K.F. Hölzenspies [mailto:p.k.f.holzensp...@utwente.nl]
 *Sent:* 24 July 2014 18:42
 *To:* Simon Peyton Jones
 *Cc:* ghc-devs@haskell.org
 *Subject:* Re: Broken Data.Data instances



 Dear Simon, et al,

 These are very good points to make for people writing such traversals
 and queries. I would be more than happy to write a page on the pitfalls
 etc. on the wiki, but in my experience so far, exploring the innards of GHC
 is tremendously helped by trying small things out and showing (bits of) the
 intermediate structures. For me, personally, this has always been hindered
 by the absence of good instances of Data and/or Show (not having to bring
 DynFlags and not just visualising with the pretty printer are very helpful).

 So... does anyone object to me changing these broken instances with
 the ones given by DeriveDataTypeable?

 Also, many of these internal data structures could be provided with
 useful lenses to improve such traversals further. Anyone ever go at that?
 Would be people be interested?

 Regards,
 Philip


  *Simon Peyton Jones* simo...@microsoft.com

 24 Jul 2014 18:22

 GHC’s data structures are often mutually recursive. e.g.

 ·The TyCon for Maybe contains the DataCon for Just

 ·The DataCon For just contains Just’s type

 ·Just’s type contains the TyCon for Maybe



 So any attempt to recursively walk over all these structures, as you
 would a tree, will fail.



 Also there’s a lot of sharing.  For example, every occurrence of ‘map’
 is a Var, and inside that Var is map’s type, its strictness, its rewrite
 RULE, etc etc.  In walking over a term you may not want to walk over all
 that stuff at every occurrence of map.



 Maybe that’s it; I’m not certain since I did not write the Data
 instances for any of GHC’s types



 Simon



 *From:* ghc-devs [mailto:ghc-devs-boun...@haskell.org
 ghc-devs-boun...@haskell.org] *On Behalf Of *
 p.k.f.holzensp...@utwente.nl
 *Sent:* 24 July 2014 16:42
 *To:* ghc-devs@haskell.org
 *Subject:* Broken Data.Data instances



 Dear GHC-ers,



 Is there a reason for explicitly broken Data.Data instances? Case in
 point:



  instance Data Var where

-- don't traverse?

toConstr _   = abstractConstr Var

gunfold _ _  = error gunfold

dataTypeOf _ = mkNoRepType Var

Re: phabricator issue with git submodules.

2014-07-27 Thread Karel Gardas


Hello Edward,

I've done that, see https://phabricator.haskell.org/D96 -- but now I'm 
curious but since this is done in this way, basically speaking 
library/unix + libraries/primitive now points to commits done in my 
forks of those libs on github.com waiting for approval since I already 
pushed appropriate pull requests. Now this also means that D96 is 
probably not includable in GHC HEAD since it points to currently 
non-existing patches (in public libraries/unix + primitive). Am I right 
that this works in this way?


Thanks,
Karel

On 07/26/14 09:39 PM, Edward Z. Yang wrote:

Hello Karel,

When your submodules get updated, you need to add them to your commit
(since the parent repository maintains pointers to the submodules).
Then they will no longer show up as dirty and you can submit the
Phabricator patch.

Edward

Excerpts from Karel Gardas's message of 2014-07-25 22:48:21 +0100:


Hi,

just fixing few warning issues on Solaris/x86. The changes spread over
main ghc tree and libraries/primitive and libraries/unix. I already
commited changes and pushed to my github.com's forks of
libraries/primitive and libraries/unix. The git status looks then:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use git push to publish your local commits)

Changes not staged for commit:
(use git addfile... to update what will be committed)
(use git checkout --file... to discard changes in working directory)

  modified:   libraries/primitive (new commits)
  modified:   libraries/unix (new commits)

no changes added to commit (use git add and/or git commit -a)


and yet phabricator still complains about it:

$ arc diff
You have unstaged changes in this working copy.

Working copy: /export/home/karel/vcs/ghc-src/validate-fixes/

Unstaged changes in working copy:
  libraries/primitive
  libraries/unix


  Do you want to amend these files to the commit? [y/N]

Usage Exception: Stage and commit (or revert) them before proceeding.

I pressed enter in question above.

Is that a known issue or am I doing something wrong here?

Thanks!
Karel




___
ghc-devs mailing list
ghc-devs@haskell.org
http://www.haskell.org/mailman/listinfo/ghc-devs


Re: phabricator issue with git submodules.

2014-07-27 Thread Edward Z . Yang
That's right.  I am actually not even sure how Harbormaster even
manages to find your commits for the build...

Edward

Excerpts from Karel Gardas's message of 2014-07-27 18:02:24 +0100:
 
 Hello Edward,
 
 I've done that, see https://phabricator.haskell.org/D96 -- but now I'm 
 curious but since this is done in this way, basically speaking 
 library/unix + libraries/primitive now points to commits done in my 
 forks of those libs on github.com waiting for approval since I already 
 pushed appropriate pull requests. Now this also means that D96 is 
 probably not includable in GHC HEAD since it points to currently 
 non-existing patches (in public libraries/unix + primitive). Am I right 
 that this works in this way?
 
 Thanks,
 Karel
 
 On 07/26/14 09:39 PM, Edward Z. Yang wrote:
  Hello Karel,
 
  When your submodules get updated, you need to add them to your commit
  (since the parent repository maintains pointers to the submodules).
  Then they will no longer show up as dirty and you can submit the
  Phabricator patch.
 
  Edward
 
  Excerpts from Karel Gardas's message of 2014-07-25 22:48:21 +0100:
 
  Hi,
 
  just fixing few warning issues on Solaris/x86. The changes spread over
  main ghc tree and libraries/primitive and libraries/unix. I already
  commited changes and pushed to my github.com's forks of
  libraries/primitive and libraries/unix. The git status looks then:
 
  $ git status
  On branch master
  Your branch is ahead of 'origin/master' by 2 commits.
  (use git push to publish your local commits)
 
  Changes not staged for commit:
  (use git addfile... to update what will be committed)
  (use git checkout --file... to discard changes in working 
  directory)
 
modified:   libraries/primitive (new commits)
modified:   libraries/unix (new commits)
 
  no changes added to commit (use git add and/or git commit -a)
 
 
  and yet phabricator still complains about it:
 
  $ arc diff
  You have unstaged changes in this working copy.
 
  Working copy: /export/home/karel/vcs/ghc-src/validate-fixes/
 
  Unstaged changes in working copy:
libraries/primitive
libraries/unix
 
 
Do you want to amend these files to the commit? [y/N]
 
  Usage Exception: Stage and commit (or revert) them before proceeding.
 
  I pressed enter in question above.
 
  Is that a known issue or am I doing something wrong here?
 
  Thanks!
  Karel
 
___
ghc-devs mailing list
ghc-devs@haskell.org
http://www.haskell.org/mailman/listinfo/ghc-devs


Re: Broken Data.Data instances

2014-07-27 Thread Alan Kim Zimmerman
To my knowledge there is no trac ticket to make the AST safe. Is this
correct? Can I make one?

Alan


On Sun, Jul 27, 2014 at 4:28 PM, Alan  Kim Zimmerman alan.z...@gmail.com
wrote:

 My intention would be to simply change the placeholders into something
 that would not blow up during a normal traversal, preferably something that
 still gives the required behaviour when invoked normally by GHC, to
 indicate a bug that needs fixing, but that can somehow be turned off at
 other tiimes.

 I am open to suggestions as to a mechanism  that can achieve this, I
 thought of some kind of setting via Dynamic Flags.


 Alan


 On Sun, Jul 27, 2014 at 4:17 PM, p.k.f.holzensp...@utwente.nl wrote:

  Alan,

 In that case, let's have a short feedback-loop between the two of us. It
 seems many of these files (Name.lhs, for example) are really stable through
 the repo-history. It would be nice to have one bigger refactoring all in
 one go (some of the code could use a polish, a lot of code seems removable).

 Regards,
 Philip

  --
 *Van:* Alan  Kim Zimmerman [alan.z...@gmail.com]
 *Verzonden:* vrijdag 25 juli 2014 13:44
 *Aan:* Simon Peyton Jones
 *CC:* Holzenspies, P.K.F. (EWI); ghc-devs@haskell.org
 *Onderwerp:* Re: Broken Data.Data instances

   By the way, I would be happy to attempt this task, if the concept is
 viable.


 On Thu, Jul 24, 2014 at 11:23 PM, Alan  Kim Zimmerman 
 alan.z...@gmail.com wrote:

While we are talking about fixing traversals, how about getting rid
 of the phase specific panic initialisers for placeHolderType,
 placeHolderKind and friends?

  In order to safely traverse with SYB, the following needs to be
 inserted into all the SYB schemes (see

 https://github.com/alanz/HaRe/blob/master/src/Language/Haskell/Refact/Utils/GhcUtils.hs
 )

 -- Check the Typeable items
 checkItemStage1 :: (Typeable a) = SYB.Stage - a - Bool
 checkItemStage1 stage x = (const False `SYB.extQ` postTcType `SYB.extQ`
 fixity `SYB.extQ` nameSet) x
   where nameSet = const (stage `elem` [SYB.Parser,SYB.TypeChecker])
 :: GHC.NameSet   - Bool
 postTcType  = const (stage  SYB.TypeChecker  )
 :: GHC.PostTcType- Bool
 fixity  = const (stage  SYB.Renamer  )
 :: GHC.Fixity- Bool

  And in addition HsCmdTop and ParStmtBlock are initialised with explicit
 'undefined values.

  Perhaps use an initialiser that can have its panic turned off when
 called via the GHC API?

  Regards
Alan



  On Thu, Jul 24, 2014 at 11:06 PM, Simon Peyton Jones 
 simo...@microsoft.com wrote:

So... does anyone object to me changing these broken instances
 with the ones given by DeriveDataTypeable?

  That’s fine with me provided (a) the default behaviour is not
 immediate divergence (which it might well be), and (b) the pitfalls are
 documented.



 Simon



 *From:* Philip K.F. Hölzenspies [mailto:p.k.f.holzensp...@utwente.nl]

 *Sent:* 24 July 2014 18:42
 *To:* Simon Peyton Jones
 *Cc:* ghc-devs@haskell.org
 *Subject:* Re: Broken Data.Data instances



 Dear Simon, et al,

 These are very good points to make for people writing such traversals
 and queries. I would be more than happy to write a page on the pitfalls
 etc. on the wiki, but in my experience so far, exploring the innards of GHC
 is tremendously helped by trying small things out and showing (bits of) the
 intermediate structures. For me, personally, this has always been hindered
 by the absence of good instances of Data and/or Show (not having to bring
 DynFlags and not just visualising with the pretty printer are very 
 helpful).

 So... does anyone object to me changing these broken instances with
 the ones given by DeriveDataTypeable?

 Also, many of these internal data structures could be provided with
 useful lenses to improve such traversals further. Anyone ever go at that?
 Would be people be interested?

 Regards,
 Philip


  *Simon Peyton Jones* simo...@microsoft.com

 24 Jul 2014 18:22

 GHC’s data structures are often mutually recursive. e.g.

 ·The TyCon for Maybe contains the DataCon for Just

 ·The DataCon For just contains Just’s type

 ·Just’s type contains the TyCon for Maybe



 So any attempt to recursively walk over all these structures, as you
 would a tree, will fail.



 Also there’s a lot of sharing.  For example, every occurrence of ‘map’
 is a Var, and inside that Var is map’s type, its strictness, its rewrite
 RULE, etc etc.  In walking over a term you may not want to walk over all
 that stuff at every occurrence of map.



 Maybe that’s it; I’m not certain since I did not write the Data
 instances for any of GHC’s types



 Simon



 *From:* ghc-devs [mailto:ghc-devs-boun...@haskell.org
 ghc-devs-boun...@haskell.org] *On Behalf Of *
 p.k.f.holzensp...@utwente.nl
 *Sent:* 24 July 2014 16:42
 *To:* ghc-devs@haskell.org
 *Subject:* Broken Data.Data instances



 Dear GHC-ers,



 Is there a reason for explicitly broken 

Re: Broken Data.Data instances

2014-07-27 Thread Edward Kmett
Philip, Alan,

If you need a hand, I'm happy to pitch in guidance.

I've had to mangle a bunch of hand-written Data instances and push out
patches to a dozen packages that used to be built this way before I
convinced the authors to switch to safer versions of Data. Using virtual
smart constructors like we do now in containers and Text where needed can
be used to preserve internal invariants, etc.

This works far better for users of the API than just randomly throwing them
a live hand grenade. As I recall, these little grenades in generic
programming over the GHC API have been a constant source of pain for
libraries like haddock.

Simon,

It seems to me that regarding circular data structures, nothing prevents
you from walking a circular data structure with Data.Data. You can generate
a new one productively that looks just like the old with the contents
swapped out, it is indistinguishable to an observer if the fixed point is
lost, and a clever observer can use observable sharing to get it back,
supposing that they are allowed to try.

Alternately, we could use the 'virtual constructor' trick there to break
the cycle and reintroduce it, but I'm less enthusiastic about that idea,
even if it is simpler in many ways.

-Edward


On Sun, Jul 27, 2014 at 10:17 AM, p.k.f.holzensp...@utwente.nl wrote:

  Alan,

 In that case, let's have a short feedback-loop between the two of us. It
 seems many of these files (Name.lhs, for example) are really stable through
 the repo-history. It would be nice to have one bigger refactoring all in
 one go (some of the code could use a polish, a lot of code seems removable).

 Regards,
 Philip

  --
 *Van:* Alan  Kim Zimmerman [alan.z...@gmail.com]
 *Verzonden:* vrijdag 25 juli 2014 13:44
 *Aan:* Simon Peyton Jones
 *CC:* Holzenspies, P.K.F. (EWI); ghc-devs@haskell.org
 *Onderwerp:* Re: Broken Data.Data instances

   By the way, I would be happy to attempt this task, if the concept is
 viable.


 On Thu, Jul 24, 2014 at 11:23 PM, Alan  Kim Zimmerman 
 alan.z...@gmail.com wrote:

While we are talking about fixing traversals, how about getting rid
 of the phase specific panic initialisers for placeHolderType,
 placeHolderKind and friends?

  In order to safely traverse with SYB, the following needs to be inserted
 into all the SYB schemes (see

 https://github.com/alanz/HaRe/blob/master/src/Language/Haskell/Refact/Utils/GhcUtils.hs
 )

 -- Check the Typeable items
 checkItemStage1 :: (Typeable a) = SYB.Stage - a - Bool
 checkItemStage1 stage x = (const False `SYB.extQ` postTcType `SYB.extQ`
 fixity `SYB.extQ` nameSet) x
   where nameSet = const (stage `elem` [SYB.Parser,SYB.TypeChecker])
 :: GHC.NameSet   - Bool
 postTcType  = const (stage  SYB.TypeChecker  )
 :: GHC.PostTcType- Bool
 fixity  = const (stage  SYB.Renamer  )
 :: GHC.Fixity- Bool

  And in addition HsCmdTop and ParStmtBlock are initialised with explicit
 'undefined values.

  Perhaps use an initialiser that can have its panic turned off when
 called via the GHC API?

  Regards
Alan



  On Thu, Jul 24, 2014 at 11:06 PM, Simon Peyton Jones 
 simo...@microsoft.com wrote:

So... does anyone object to me changing these broken instances
 with the ones given by DeriveDataTypeable?

  That’s fine with me provided (a) the default behaviour is not
 immediate divergence (which it might well be), and (b) the pitfalls are
 documented.



 Simon



 *From:* Philip K.F. Hölzenspies [mailto:p.k.f.holzensp...@utwente.nl]
 *Sent:* 24 July 2014 18:42
 *To:* Simon Peyton Jones
 *Cc:* ghc-devs@haskell.org
 *Subject:* Re: Broken Data.Data instances



 Dear Simon, et al,

 These are very good points to make for people writing such traversals
 and queries. I would be more than happy to write a page on the pitfalls
 etc. on the wiki, but in my experience so far, exploring the innards of GHC
 is tremendously helped by trying small things out and showing (bits of) the
 intermediate structures. For me, personally, this has always been hindered
 by the absence of good instances of Data and/or Show (not having to bring
 DynFlags and not just visualising with the pretty printer are very helpful).

 So... does anyone object to me changing these broken instances with
 the ones given by DeriveDataTypeable?

 Also, many of these internal data structures could be provided with
 useful lenses to improve such traversals further. Anyone ever go at that?
 Would be people be interested?

 Regards,
 Philip


  *Simon Peyton Jones* simo...@microsoft.com

 24 Jul 2014 18:22

 GHC’s data structures are often mutually recursive. e.g.

 ·The TyCon for Maybe contains the DataCon for Just

 ·The DataCon For just contains Just’s type

 ·Just’s type contains the TyCon for Maybe



 So any attempt to recursively walk over all these structures, as you
 would a tree, will fail.



 Also there’s a lot of sharing.  For example, 

Re: Broken Data.Data instances

2014-07-27 Thread Alan Kim Zimmerman
Philip

How would you like to take this forward? From my side I would appreciate
all guidance/help to get it resolved, it is a huge hindrance for HaRe.

Alan


On Sun, Jul 27, 2014 at 7:27 PM, Edward Kmett ekm...@gmail.com wrote:

 Philip, Alan,

 If you need a hand, I'm happy to pitch in guidance.

 I've had to mangle a bunch of hand-written Data instances and push out
 patches to a dozen packages that used to be built this way before I
 convinced the authors to switch to safer versions of Data. Using virtual
 smart constructors like we do now in containers and Text where needed can
 be used to preserve internal invariants, etc.

 This works far better for users of the API than just randomly throwing
 them a live hand grenade. As I recall, these little grenades in generic
 programming over the GHC API have been a constant source of pain for
 libraries like haddock.

 Simon,

 It seems to me that regarding circular data structures, nothing prevents
 you from walking a circular data structure with Data.Data. You can generate
 a new one productively that looks just like the old with the contents
 swapped out, it is indistinguishable to an observer if the fixed point is
 lost, and a clever observer can use observable sharing to get it back,
 supposing that they are allowed to try.

 Alternately, we could use the 'virtual constructor' trick there to break
 the cycle and reintroduce it, but I'm less enthusiastic about that idea,
 even if it is simpler in many ways.

 -Edward


 On Sun, Jul 27, 2014 at 10:17 AM, p.k.f.holzensp...@utwente.nl wrote:

  Alan,

 In that case, let's have a short feedback-loop between the two of us. It
 seems many of these files (Name.lhs, for example) are really stable through
 the repo-history. It would be nice to have one bigger refactoring all in
 one go (some of the code could use a polish, a lot of code seems removable).

 Regards,
 Philip

  --
 *Van:* Alan  Kim Zimmerman [alan.z...@gmail.com]
 *Verzonden:* vrijdag 25 juli 2014 13:44
 *Aan:* Simon Peyton Jones
 *CC:* Holzenspies, P.K.F. (EWI); ghc-devs@haskell.org
 *Onderwerp:* Re: Broken Data.Data instances

   By the way, I would be happy to attempt this task, if the concept is
 viable.


 On Thu, Jul 24, 2014 at 11:23 PM, Alan  Kim Zimmerman 
 alan.z...@gmail.com wrote:

While we are talking about fixing traversals, how about getting rid
 of the phase specific panic initialisers for placeHolderType,
 placeHolderKind and friends?

  In order to safely traverse with SYB, the following needs to be
 inserted into all the SYB schemes (see

 https://github.com/alanz/HaRe/blob/master/src/Language/Haskell/Refact/Utils/GhcUtils.hs
 )

 -- Check the Typeable items
 checkItemStage1 :: (Typeable a) = SYB.Stage - a - Bool
 checkItemStage1 stage x = (const False `SYB.extQ` postTcType `SYB.extQ`
 fixity `SYB.extQ` nameSet) x
   where nameSet = const (stage `elem` [SYB.Parser,SYB.TypeChecker])
 :: GHC.NameSet   - Bool
 postTcType  = const (stage  SYB.TypeChecker  )
 :: GHC.PostTcType- Bool
 fixity  = const (stage  SYB.Renamer  )
 :: GHC.Fixity- Bool

  And in addition HsCmdTop and ParStmtBlock are initialised with explicit
 'undefined values.

  Perhaps use an initialiser that can have its panic turned off when
 called via the GHC API?

  Regards
Alan



  On Thu, Jul 24, 2014 at 11:06 PM, Simon Peyton Jones 
 simo...@microsoft.com wrote:

So... does anyone object to me changing these broken instances
 with the ones given by DeriveDataTypeable?

  That’s fine with me provided (a) the default behaviour is not
 immediate divergence (which it might well be), and (b) the pitfalls are
 documented.



 Simon



 *From:* Philip K.F. Hölzenspies [mailto:p.k.f.holzensp...@utwente.nl]

 *Sent:* 24 July 2014 18:42
 *To:* Simon Peyton Jones
 *Cc:* ghc-devs@haskell.org
 *Subject:* Re: Broken Data.Data instances



 Dear Simon, et al,

 These are very good points to make for people writing such traversals
 and queries. I would be more than happy to write a page on the pitfalls
 etc. on the wiki, but in my experience so far, exploring the innards of GHC
 is tremendously helped by trying small things out and showing (bits of) the
 intermediate structures. For me, personally, this has always been hindered
 by the absence of good instances of Data and/or Show (not having to bring
 DynFlags and not just visualising with the pretty printer are very 
 helpful).

 So... does anyone object to me changing these broken instances with
 the ones given by DeriveDataTypeable?

 Also, many of these internal data structures could be provided with
 useful lenses to improve such traversals further. Anyone ever go at that?
 Would be people be interested?

 Regards,
 Philip


  *Simon Peyton Jones* simo...@microsoft.com

 24 Jul 2014 18:22

 GHC’s data structures are often mutually recursive. e.g.

 ·The TyCon for Maybe contains the DataCon for 

Re: Broken Data.Data instances

2014-07-27 Thread Richard Eisenberg
What if there is a good reason for a missing/broken Data.Data instance? I'm 
specifically thinking of GADTs. There are few currently, but I, for one, have 
toyed with the idea of adding more. My recollection is that Data.Data doesn't 
work with GADTs. As a concrete, existent example, see CoAxiom.BranchList, which 
allows for type-level reification of singleton lists as distinct from other, 
not-necessarily-singleton lists.

I would very much like to support API usage that would benefit from working 
Data.Data instances, but I also want to be sure we're not eliminating other 
possible futures without due discussion.

Richard

On Jul 27, 2014, at 2:04 PM, Alan  Kim Zimmerman alan.z...@gmail.com wrote:

 Philip
 
 How would you like to take this forward? From my side I would appreciate all 
 guidance/help to get it resolved, it is a huge hindrance for HaRe.
 
 Alan
 
 
 On Sun, Jul 27, 2014 at 7:27 PM, Edward Kmett ekm...@gmail.com wrote:
 Philip, Alan, 
 
 If you need a hand, I'm happy to pitch in guidance. 
 
 I've had to mangle a bunch of hand-written Data instances and push out 
 patches to a dozen packages that used to be built this way before I convinced 
 the authors to switch to safer versions of Data. Using virtual smart 
 constructors like we do now in containers and Text where needed can be used 
 to preserve internal invariants, etc.
 
 This works far better for users of the API than just randomly throwing them a 
 live hand grenade. As I recall, these little grenades in generic programming 
 over the GHC API have been a constant source of pain for libraries like 
 haddock.
 
 Simon,
 
 It seems to me that regarding circular data structures, nothing prevents you 
 from walking a circular data structure with Data.Data. You can generate a new 
 one productively that looks just like the old with the contents swapped out, 
 it is indistinguishable to an observer if the fixed point is lost, and a 
 clever observer can use observable sharing to get it back, supposing that 
 they are allowed to try.
 
 Alternately, we could use the 'virtual constructor' trick there to break the 
 cycle and reintroduce it, but I'm less enthusiastic about that idea, even if 
 it is simpler in many ways.
 
 -Edward
 
 
 On Sun, Jul 27, 2014 at 10:17 AM, p.k.f.holzensp...@utwente.nl wrote:
 Alan,
 
 In that case, let's have a short feedback-loop between the two of us. It 
 seems many of these files (Name.lhs, for example) are really stable through 
 the repo-history. It would be nice to have one bigger refactoring all in one 
 go (some of the code could use a polish, a lot of code seems removable).
 
 Regards,
 Philip
 
 Van: Alan  Kim Zimmerman [alan.z...@gmail.com]
 Verzonden: vrijdag 25 juli 2014 13:44
 Aan: Simon Peyton Jones
 CC: Holzenspies, P.K.F. (EWI); ghc-devs@haskell.org
 Onderwerp: Re: Broken Data.Data instances
 
 By the way, I would be happy to attempt this task, if the concept is viable.
 
 
 On Thu, Jul 24, 2014 at 11:23 PM, Alan  Kim Zimmerman alan.z...@gmail.com 
 wrote:
 While we are talking about fixing traversals, how about getting rid of the 
 phase specific panic initialisers for placeHolderType, placeHolderKind and 
 friends?
 
 In order to safely traverse with SYB, the following needs to be inserted into 
 all the SYB schemes (see 
 https://github.com/alanz/HaRe/blob/master/src/Language/Haskell/Refact/Utils/GhcUtils.hs)
 
 -- Check the Typeable items
 checkItemStage1 :: (Typeable a) = SYB.Stage - a - Bool
 checkItemStage1 stage x = (const False `SYB.extQ` postTcType `SYB.extQ` 
 fixity `SYB.extQ` nameSet) x
   where nameSet = const (stage `elem` [SYB.Parser,SYB.TypeChecker]) :: 
 GHC.NameSet   - Bool
 postTcType  = const (stage  SYB.TypeChecker  ) :: 
 GHC.PostTcType- Bool
 fixity  = const (stage  SYB.Renamer  ) :: 
 GHC.Fixity- Bool
 
 And in addition HsCmdTop and ParStmtBlock are initialised with explicit 
 'undefined values.
 
 Perhaps use an initialiser that can have its panic turned off when called via 
 the GHC API?
 
 Regards
   Alan
 
 
 
 On Thu, Jul 24, 2014 at 11:06 PM, Simon Peyton Jones simo...@microsoft.com 
 wrote:
 So... does anyone object to me changing these broken instances with the 
 ones given by DeriveDataTypeable?
 
 
 That’s fine with me provided (a) the default behaviour is not immediate 
 divergence (which it might well be), and (b) the pitfalls are documented.
 
  
 
 Simon
 
  
 
 From: Philip K.F. Hölzenspies [mailto:p.k.f.holzensp...@utwente.nl] 
 Sent: 24 July 2014 18:42
 To: Simon Peyton Jones
 Cc: ghc-devs@haskell.org
 Subject: Re: Broken Data.Data instances
 
  
 
 Dear Simon, et al,
 
 These are very good points to make for people writing such traversals and 
 queries. I would be more than happy to write a page on the pitfalls etc. on 
 the wiki, but in my experience so far, exploring the innards of GHC is 
 tremendously helped by trying small things out and showing (bits of) the 
 

Re: Broken Data.Data instances

2014-07-27 Thread Edward Kmett
Im mostly looking at the Data.Data stuff as nice to have at this point.
Well, it really is need to have for some users, but they can typically get
by by writing a few hundred lines of boilerplate when its not there.

If you need to break something internally and it costs us a Data instance
for something? Have at it.

If we can still hack around the changes with Data then great.

Otherwise the Data machinery has always been for expert users who already
deal with a great deal of breakage anyways, so thrashing on that API seems
fine to me. Not desirable, but not unexpected.

-Edward


On Sun, Jul 27, 2014 at 9:49 PM, Richard Eisenberg e...@cis.upenn.edu
wrote:

 What if there is a good reason for a missing/broken Data.Data instance?
 I'm specifically thinking of GADTs. There are few currently, but I, for
 one, have toyed with the idea of adding more. My recollection is that
 Data.Data doesn't work with GADTs. As a concrete, existent example, see
 CoAxiom.BranchList, which allows for type-level reification of singleton
 lists as distinct from other, not-necessarily-singleton lists.

 I would very much like to support API usage that would benefit from
 working Data.Data instances, but I also want to be sure we're not
 eliminating other possible futures without due discussion.

 Richard

 On Jul 27, 2014, at 2:04 PM, Alan  Kim Zimmerman alan.z...@gmail.com
 wrote:

 Philip

 How would you like to take this forward? From my side I would appreciate
 all guidance/help to get it resolved, it is a huge hindrance for HaRe.

 Alan


 On Sun, Jul 27, 2014 at 7:27 PM, Edward Kmett ekm...@gmail.com wrote:

 Philip, Alan,

 If you need a hand, I'm happy to pitch in guidance.

 I've had to mangle a bunch of hand-written Data instances and push out
 patches to a dozen packages that used to be built this way before I
 convinced the authors to switch to safer versions of Data. Using virtual
 smart constructors like we do now in containers and Text where needed can
 be used to preserve internal invariants, etc.

 This works far better for users of the API than just randomly throwing
 them a live hand grenade. As I recall, these little grenades in generic
 programming over the GHC API have been a constant source of pain for
 libraries like haddock.

 Simon,

 It seems to me that regarding circular data structures, nothing prevents
 you from walking a circular data structure with Data.Data. You can generate
 a new one productively that looks just like the old with the contents
 swapped out, it is indistinguishable to an observer if the fixed point is
 lost, and a clever observer can use observable sharing to get it back,
 supposing that they are allowed to try.

 Alternately, we could use the 'virtual constructor' trick there to break
 the cycle and reintroduce it, but I'm less enthusiastic about that idea,
 even if it is simpler in many ways.

 -Edward


 On Sun, Jul 27, 2014 at 10:17 AM, p.k.f.holzensp...@utwente.nl wrote:

  Alan,

 In that case, let's have a short feedback-loop between the two of us. It
 seems many of these files (Name.lhs, for example) are really stable through
 the repo-history. It would be nice to have one bigger refactoring all in
 one go (some of the code could use a polish, a lot of code seems removable).

 Regards,
 Philip

  --
 *Van:* Alan  Kim Zimmerman [alan.z...@gmail.com]
 *Verzonden:* vrijdag 25 juli 2014 13:44
 *Aan:* Simon Peyton Jones
 *CC:* Holzenspies, P.K.F. (EWI); ghc-devs@haskell.org
 *Onderwerp:* Re: Broken Data.Data instances

   By the way, I would be happy to attempt this task, if the concept is
 viable.


 On Thu, Jul 24, 2014 at 11:23 PM, Alan  Kim Zimmerman 
 alan.z...@gmail.com wrote:

While we are talking about fixing traversals, how about getting rid
 of the phase specific panic initialisers for placeHolderType,
 placeHolderKind and friends?

  In order to safely traverse with SYB, the following needs to be
 inserted into all the SYB schemes (see

 https://github.com/alanz/HaRe/blob/master/src/Language/Haskell/Refact/Utils/GhcUtils.hs
 )

 -- Check the Typeable items
 checkItemStage1 :: (Typeable a) = SYB.Stage - a - Bool
 checkItemStage1 stage x = (const False `SYB.extQ` postTcType `SYB.extQ`
 fixity `SYB.extQ` nameSet) x
   where nameSet = const (stage `elem` [SYB.Parser,SYB.TypeChecker])
 :: GHC.NameSet   - Bool
 postTcType  = const (stage  SYB.TypeChecker  )
 :: GHC.PostTcType- Bool
 fixity  = const (stage  SYB.Renamer  )
 :: GHC.Fixity- Bool

  And in addition HsCmdTop and ParStmtBlock are initialised with
 explicit 'undefined values.

  Perhaps use an initialiser that can have its panic turned off when
 called via the GHC API?

  Regards
Alan



  On Thu, Jul 24, 2014 at 11:06 PM, Simon Peyton Jones 
 simo...@microsoft.com wrote:

   So... does anyone object to me changing these broken instances
 with the ones given by DeriveDataTypeable?

  That’s fine with me