Martin Sjögren wrote:
On Tue, 16 Nov 2004 15:04:02 +0000, Ian Lynagh <igloo@earth.li> wrote:
Hi all,
Is there a good reason why I can't say
data Bar = Bar { _ :: Int, _ :: Char, x :: Bool }
?
I agree that it would be useful, but wouldn't data Bar = Bar Int Char { x :: Bool } make more sense as far as syntax goes?
It's a bit problematic because of the current all-at-once behavior of labeled construction. One would presumably want to construct a Bar with an expression like Bar 3 'c' { x = False } But that won't work because the brace notation has a higher precedence than function application (!). You'd have to write (Bar 3 'c') { x = False } I guess you could give Bar the type (Int -> Char -> Bar), with the understanding that it initializes x to _|_, and treat the { x = False } as an update. But to be consistent, the data constructor in a declaration like data Quux = Quux { x :: Int, y :: Char, z :: Bool } ought to have the type Quux then, not (Int -> Char -> Bool -> Quux) as it does currently. And none of this is going to work if your labeled field is in any position except the last. -- Ben