
On 2010 Oct 14, at 09:58, Ketil Malde wrote:
Jacek Generowicz
writes: Let's say I need an Int -> String. Both
(fnA2 :: Banana -> String) . (fnA1:: Int -> Banana)
and
(fnB2 :: Onion -> String) . (fnB1 :: Int -> Onion)
will do. So please allow me to store (fnA1, fnA2) and (fnB1, fnB2) in the same place.
I think you can do this fairly easy with existentials, but..
Yup, that's got through to me by now :-)
The program can tell that it can combine them with (.)
..what else do you want to be able to do with them? (Because, if this is all, you'd just store the combination, no?).
Yes, if the components became available at the same time. But they don't. However, I think that currying caters for this separate arrival time problem. Hmm, except that I would like to be able to store a collection of incomplete combinations and say "complete the combination by injecting random arguments of the relevant type". (This probably won't make sense unless you saw the "arithmetic test" motivating example.) And currying can't deal with this, as the *incomplete* combinations will have different types. But I suspect that Brandon's suggestion to use QuickCheck's Gen monad, could well help with this.