data label overloading
Serge D. Mechveliani
mechvel at botik.ru
Wed Jan 14 09:59:33 EST 2004
To my recent suggestion on the field label overloading
> > ...
> > data Foo1 = Foo1 {size :: Int ...}
> > data Foo2 = Foo2 {size :: Int ...}
> > ...
> > f x y z = let size = Foo1..size in
> > (size x)+(size y)+(Foo2..size z)
>
Hal Daume III wrote on Jan 13, 2004
> How does this save you typing over:
>
> data Foo1 = Foo1 { foo1_size :: Int }
> data Foo2 = Foo2 { foo2_size :: Int }
>
> f x y z = let size = foo1_size
> in
> (size x) + (size y) + (Foo2..size z)
>
> also, this would lead to highly ambiguous parses, i think.
>
Here is an example with improved suggestion:
data Foo1 = Foo1 {size :: Int, ...}
data Foo2 = Foo2 {size :: Int, ...}
data Foo3 a b = Foo3 {size :: a, ...}
f :: Foo1 -> Foo1 -> Foo2 -> Int
f x y z = let n = (size x)+(size y)+(size z)
in
(g (x {size = n})) + 1
h v = v {size = 0} :: Foo3 _ _
g u = size (u :: Foo3 _ _)
Very often the type or argument is clear. In such a case the compiler
solves the label version. And in a dubious case the programmer adds
the type denotation.
Will this do?
Copy, please, the answer to mechvel at botik.ru
With kind regards,
-----------------
Serge Mechveliani
mechvel at botik.ru
More information about the Haskell
mailing list