[Haskell-cafe] Set of reals...?
glynn at gclements.plus.com
Thu Oct 28 23:21:22 EDT 2004
Stijn De Saeger wrote:
> Now, for unions I tried the following:
> to take the union of two BasicSets, just append them and contract the result.
> contracting meaning: merge overlapping intervals.
> > contract :: Range -> Range -> BasicSet
> > contract (x1,y1) (x2,y2)
> > | x2 <= y1 = if x2 >= x1 then [(x1, (max y1 y2))] else
> > if y2 >= x1 then [(x2, (max y1 y2))] else [(x2,y2), (x1,y1)]
> > | x1 <= y2 = if x1 >= x2 then [(x2, (max y1 y2))] else
> > if y1 >= x2 then [(x1, (max y1 y2))] else [(x1,y1), (x2,y2)]
> > | x1 <= x2 = [(x1,y1), (x2, y2)]
> Now generalizing this from Ranges to BasicSets is where i got stuck.
> In my limited grasp of haskell and FP, this contractSet function below
> is just crying for the use of a fold operation, but i can't for the
> life of me see how to do it.
As the result is a BasicSet, the accumulator would need to be a
BasicSet and the operator would need to have type:
BasicSet -> Range -> BasicSet
This can presumably be implemented as a fold on contract, so
contractSet would essentially be a doubly-nested fold.
Glynn Clements <glynn at gclements.plus.com>
More information about the Haskell-Cafe