
Taral wrote:
On 1/10/06, Brian Hulley
wrote: Hi - I'm wondering if there is any possiblility of getting intersection types into Haskell. For example, at the moment there is no (proper) typing for:
f g x y = (g x, g y)
Ideally, I'd like to be able to write:
f:: (a -> b & c -> d) -> a -> c -> (b,d)
I have no idea what kind of function would have type (a -> b & c -> d). Can you give an example?
g x = x because g 3 = 3 so g has type Int -> Int but also g 'a' = 'a' so g has type Char -> Char hence g has type Int -> Int & Char -> Char Also, h x = (x,x) ie Int -> (Int,Int) & Char -> (Char,Char) The reason I can't just use a -> b for g's type is that then I would have no way to write out the result of f, since it is not (b,b)
f :: (a -> b a) -> c -> d -> (b c, b d)
f :: (forall a. a -> b a) -> c -> d -> (b c, b d)
That would be nice but unfortunately is not accepted by GHC because it cannot unify a->a with a -> b a, for example the following does not compile: {-# OPTIONS -fglasgow-exts #-} f :: (forall a. a -> b a) -> c -> d -> (b c, b d) f g x y = (g x, g y) g x = x main = do putStrLn (show (f g 3 'c')) Regards, Brian Hulley