{-# LANGUAGE RankNTypes #-} data RegionFold a = RegionFold { uc :: a , -- unit circle sc :: (Float,a) -> a, -- scale un :: (a,a) -> a -- union } type Region = forall a. RegionFold a -> a unitcircle :: Region unitcircle = uc scale :: Float -> Region -> Region scale f r fld = (sc fld) (f,r fld) union :: Region -> Region -> Region union r1 r2 fld = un fld $ (r1 fld, r2 fld) example :: Region example = union (scale 2.0 unitcircle) unitcircle eval :: Region -> ((Float,Float) -> Bool) eval r = r (RegionFold (\(x,y) -> x*x+y*y <= 1) (\(f,r) (x,y) -> r (f*x,f*y)) (\(r1,r2) p -> r1 p || r2 p))