Christian Maeder <[EMAIL PROTECTED]> writes:

> >>voidcast :: Fields a -> Fields Void
> >>voidcast v@(VariantWithTwo{}) = v { field1 = Void , field2 = Void }
> >>voidcast v@(VariantWithOne{}) = v { field1 = Void }
> 
> I would not expect that updating only field1 can change the type of v.
> The right thing is to construct a new value. This looks as follows with
> record syntax:
> 
> voidcast VariantWithTwo{} =
>     VariantWithTwo { field1 = Void , field2 = Void }
> voidcast VariantWithOne{} =
>     VariantWithOne { field1 = Void }

Ah, but the reason I want to use field update, rather than a new
construction on the rhs, is that my type really has lots of other
fields (not mentioned here), which are all of fixed definite types
(not parametric).  It is much nicer to be able to write

    v { field1 = Void }

than

    VariantWithOne { field1 = Void
                   , field2 = field2 v
                   , field3 = field3 v
                   , field4 = field4 v
                   , field5 = field5 v
                     ...
                   }

which has so much more scope for making a mistake, not to mention the
extra maintainance work required if I ever add or delete a field from
the type.

Regards,
    Malcolm
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to