
On 19 February 2015 at 13:43, Oliver Charles
This has actually reminded me of another point. Tuples are one form of construction in Haskell that is somewhat special - but another is using record syntax. I wonder if it would be possible to use idiom brackets there to lift the record constructor too:
(| T { a = x, b = y } |)
This would desugar into (something like)
(\a b -> T {..}) <$> x <*> y
Yeah, this would nicely handle: (1) being explicit about naming when you want to be, (2) order of effects.
In this case, we've "lifted" the original syntax into the idiom brackets, so I think it's only natural that we're able to lift tuple construction into these brackets too. My preference would be that
(| (g x y, h (g x y) |)
There's a wee bit of contention with (| foo |) which is supposed to be "pure foo", AIUI. I saw elsewhere someone suggest: (| g x y, h x y |) But that doesn't help with a way to involve records. -- On an unrelated note but the same topic, "applicative comprehensions" could be fun: (| f a b |) and (| f a b | a <- x, b <- y |) and (| T{..} | a <- x, b <- y |)