
Whilst on existential types, perhaps someone can tell me if this is a valid use: I wish to define a flexible report, consisting of a set of columns. The contents of each column can be defined by mapping a function to a row descriptor, generating a value, and then converting each value to a string. I also wish to present an aggregate value at the bottom of the column defined by another function. It seems that exisistential types are required to get this sort of thing to work. Is there another way? Tim -------------------- data ColDesc rowv = forall a. ColDesc (rowv -> a) ([a] -> a) (a -> String) calculate :: [rowv] -> ColDesc rowv -> ([String],String) calculate rs (ColDesc valf sumf fmtf) = let vals = map valf rs in (map fmtf vals, (fmtf.sumf) vals) rows = ["I","wish","to","define","a","report"] cols = [ ColDesc id (\_ -> "") id, ColDesc length sum show, ColDesc (\s -> length s * length s) maximum show ] values = [ calculate rows col | col <- cols ]
participants (1)
-
Tim Docker