The missing dataCast1 is just a bug, yes. I suppose someone who uses Bag
and cares can submit something about fixing gunfold.

On Thu, Sep 20, 2012 at 7:22 AM, José Pedro Magalhães <j...@cs.uu.nl> wrote:

> Right now I was just planning to fix the missing dataCast1 from Bag, and
> the rest from
> Data.Data (see http://hackage.haskell.org/trac/ghc/ticket/7256). I think
> those are just
> a bug, unrelated to the abstraction story, no?
>
>
> Cheers,
> Pedro
>
>
> On Thu, Sep 20, 2012 at 12:19 PM, Edward Kmett <ekm...@gmail.com> wrote:
>
>> Note: It was probably built with an eye towards how Data.Map and the like
>> performed abstraction. However, This isn't necessary to protect the
>> invariants of a bag.
>>
>> The constructors exposed via Data do not have to be the actual
>> constructors of the data type. With this you can quotient out the portions
>> of the structure you don't want the user to be able to inspect.
>>
>> See the libraries@ proposal that I put in 3-4 weeks ago (which will have
>> just passed) to fix all the broken Data instances for containers by using
>> virtual constructors such as 'fromList', (which incidentally led to Milan
>> finding huge space and time improvements in fromList).
>>
>> Effectively allowing the user to use the 'listToBag' as a "constructor"
>> loses no information violates no invariants, and prevents code written for
>> uniplate, SYB, etc. from having to crash, panic or give up upon the sight
>> of a mkNoRepType.
>>
>> My reaction for years to the sight of a mkNoRepType and undefined gunfold
>> has been to hang my head. Now I just fix them.
>>
>> -Edward
>>
>> On Wed, Aug 29, 2012 at 7:11 AM, José Pedro Magalhães <j...@cs.uu.nl>wrote:
>>
>>> Hi Philip,
>>>
>>> On Wed, Aug 29, 2012 at 12:01 PM, Philip Holzenspies <
>>> p...@st-andrews.ac.uk> wrote:
>>>
>>>> Dear GHCers,
>>>>
>>>> I'm performing traversals over GHC-API results (HsSyn et al). For this
>>>> purpose, I'm using SYB generics.
>>>>
>>>> I found that I couldn't use "ext1Q" for a function with type "Data x =>
>>>> Bag x -> String", i.e. that this function was never applied. The source of
>>>> Bag's instance of the Data class seems to explain why:
>>>>
>>>>
>>>> instance Data a => Data (Bag a) where
>>>>   gfoldl k z b = z listToBag `k` bagToList b -- traverse abstract type
>>>> abstractly
>>>>   toConstr _   = abstractConstr $ "Bag("++show (typeOf
>>>> (undefined::a))++")"
>>>>   gunfold _ _  = error "gunfold"
>>>>   dataTypeOf _ = mkNoRepType "Bag"
>>>>
>>>>
>>>> Is there a rationale to not allow gunfolds and to keep toConstr
>>>> abstract?
>>>
>>>
>>> As far as I understand, this is to keep `Bag` itself abstract,
>>> preventing users from inspecting its internals.
>>>
>>>
>>>> More to the point for my needs, is there a reason to not allow
>>>> dataCast1 casting of Bags?
>>>>
>>>
>>> That is a separate issue; I believe this instance is just missing a
>>> `dataCast1 = gcast1` line.
>>> All datatypes of kind `* -> *` should have such a definition.
>>>
>>> (Having a look at Data.Data, I guess the same applies to `Ptr a` and
>>> `ForeignPtr a`.
>>> And `Array a b` seems to be missing the `dataCast2` method. I propose
>>> fixing all of these.)
>>>
>>>
>>> Cheers,
>>> Pedro
>>>
>>>
>>>>
>>>> Regards,
>>>> Philip
>>>> _______________________________________________
>>>> Glasgow-haskell-users mailing list
>>>> Glasgow-haskell-users@haskell.org
>>>> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
>>>>
>>>
>>>
>>> _______________________________________________
>>> Glasgow-haskell-users mailing list
>>> Glasgow-haskell-users@haskell.org
>>> http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
>>>
>>>
>>
>
_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to