
On Tue, 2007-07-10 at 17:04 +0000, kahl@cas.mcmaster.ca wrote:
Isaac Dupree
wrote: Adde wrote:
tmp <- foo return Bar { barFoo = tmp }
There is a feature being worked on in GHC HEAD that would let you do
do tmp <- foo return Bar{..}
which captures fields from everything of the same name that's in scope. I think this would also satisfy your desire.
I guess this means I could write:
data D = C {field1 :: Bool, field2 :: Char}
f x = do field1 <- foo1 field2 <- foo2 field3 <- foo3 other stuff return C{..}
instead of
f x = do tmp1 <- foo1 tmp2 <- foo2 field3 <- foo3 other stuff return $ C { field1 = tmp1, field2 = tmp2 }
This has a dangerous feel to it --- extending the definition of D to include a field field3 may have quite unintended consequences.
What I am missing most in the record arena is a functional notation for record update, for example:
{^ field1 } = \ f r -> r {field1 = f (field1 r)}
I agree, capturing variables without asking is just scary. While I'm pretty biased I still think my suggestion solves the problem in a cleaner, more consistent way. /Adde