
I have no particular opinions on the internals of LVish.
I do have concern than your supplied Generic for Set seems rather borked
though, so I felt I should explain the issue lest someone take it as a
model for how to define a custom Generic! =)
A real valid 'virtual' Rep (Set a) would be a fair bit more complicated
with something like
instance Generic Set where
type Rep (Set a) = D1 D_Set (C1 C_fromList (S1 NoSelector (Rec0 [a]))
to (M1 (M1 (M1 (K1 as))) = fromList as
from as = M1 (M1 (M1 (K1 (toList as)
instance Generic1 Set where
type Rep1 Set = D1 D1_Set (C1 C1_fromList (S1 NoSelector (Rec1 []))
...
with a custom Datatype instances D_Set, D1_Set and custom virtual
Constructor instances C_fromList and C1_fromList.
Otherwise it won't deal correctly with any code out there that was written
to assume a properly constructed Generic.
Headaches like that are why few of us ever implement Generic or Generic1 by
hand. ;)
Actually, I can't think of anyone else who has bothered. I was forced to
figure it out back when Generic1 deriving was broken.
-Edward
On Mon, Oct 7, 2013 at 3:28 PM, adam vogt
Again, my use-case (closed/safe Eq & Ord instances) is a few steps removed from this Generics business and I don't feel strongly about how it gets done. But having *SOME* way of doing it will be a massive boon to my lab's particular effort at maximizing the abilities of guaranteed-Safe deterministic parallelism in Haskell. Further, I think anyone else who tries to do something in SafeHaskell that depends on guaranteeing a closed/controlled set of instances (SafeEq, SafeOrd but also others)
On Mon, Oct 7, 2013 at 1:33 PM, Ryan Newton
wrote: based on GHC.Generics will *also* find this change useful.
Hi,
In containers we have Data instances "This instance preserves data abstraction at the cost of inefficiency". Generic is a more modern way to address the same problem. This Generic instance for Set is just a more convenient way to use Set.toList/Set.fromList http://lpaste.net/94028, which are -XSafe functions right?
For your problem I suggest using template-haskell to write your "SafeEq" "SafeOrd" instances. It will let you access unexported constructors too, which means people using LVish can maintain their abstractions for everybody except LVish. My understanding is that the proposed changes to ghc/Generic would mean that all data used with LVish would have to expose it's implementation to everybody through the derived Generic instance.
Regards, Adam