[Haskell-cafe] Type inference

Brian Hulley brianh at metamilk.com
Thu Feb 9 03:03:12 EST 2006


Cale Gibbard wrote:
> On 09/02/06, Brian Hulley <brianh at metamilk.com> wrote:
>> Brian Hulley wrote:
>>
>> f :: forall m. (forall a. a->m a) -> c -> d -> (m c, m d)
>
> Of course this type doesn't work on your original example, since (,)
> is a type constructor with two parameters, not one, but this type
> signature does actually work just fine in GHC.
>
> ---
> data Pair x = Pair x x deriving Show
> data Id x = Id x deriving Show
>
> f :: forall m c d. (forall a. a -> m a) -> c -> d -> (m c, m d)
> f g x y = (g x, g y)
> ---
> *Main> f (\x -> Pair x x) 3 "hello"
> (Pair 3 3,Pair "hello" "hello")
> *Main> f (\x -> Id x) 3 "hello"
> (Id 3,Id "hello")

Perhaps in practice this kind of workaround is sufficient, although this 
requires you to put the results into a form that can be syntactically 
matched against m a.

I wonder though if it would be possible to have a type system that would 
work for my original example by automatically creating internal declarations 
type T1 a = (a,a)  and type T2 a = a so that m would match against T1 and T2 
respectively.

It is difficult to know if this would be a worthwhile thing to do or if most 
practical applications of polymorphism in any case involve transformations 
whose shape can be captured sufficiently with multi-param typeclasses etc.

Regards, Brian




More information about the Haskell-Cafe mailing list