Monomorphism, monomorphism...

Juan Carlos Arévalo Baeza jcab@roningames.com
Fri, 5 Oct 2001 19:02:50 -0700


On Fri, 05 Oct 2001 21:25:57 +0200, Karl-Filip Faxen wrote:

>The monomorphism restriction goes like this in my inference=
 rules:
>
>If a declaration group contains a pattern binding with a=
 nonvariable pattern
>or one where there is no type signature for the variable, then=
 the context
>parts of the type schemes derived for the bound variables must=
 be empty.
>
>class IsNil a where
>=A0isNil :: a ->=A0Bool
>
>f x y =3D let g =3D isNil
>=A0=A0=A0=A0=A0in (g x, g y)

   I'm still having a lot of trouble grasping and comprehending=
 this "monomorphism restriction". It just doesn't feel right, and=
 I keep having a lot of trouble juggling all the descriptions I=
 found on the web. So, I'll don my newbie hat and start asking=
 all the obvious questions.

   I hope I don't annoy too much. I know there are people tired=
 of discussing this, but the thing is that this monomorphism=
 restriction is something very easy to bump into (I have), but=
 all the definitions out there seem to be unable to seep in.=
 Especially the one in the Haskell Report, BTW.

>"If a declaration group"

   Meaning something like "let g =3D isNil" up there?

>"contains a pattern binding with a nonvariable pattern"

   Meaning... what exactly?

>"or one [pattern binding] where there is no type signature for=
 the variable"

   Meaning "g =3D isNil" above, without type signature for "g"?

>"then the context parts of the type schemes derived for the=
 bound variables must be empty"

   Meaning that in "let g =3D ...", "g" cannot be "g :: <context>=
 =3D> <type>" unless the context is explicitly given?

   Hmmm... This still sounds like nonsensical (as in=
 counterintuitive and artificial) to me. In a definition like=
 "let g =3D isNil" there cannot be any compelling reason to give=
 "g" any type different than the type of "isNil".

>The monomorphism restriction applies to the binding of "g"=
 since
>there is no type signature. Thus it is not legal to derive
>"forall a . IsNil a =3D>=A0a ->=A0Bool",

   Ok... This is probably the one explanation that has begun to=
 make an impact in my mind.

>but two legal possibilities are
>- forall b . [b] ->=A0Bool, and

   Choosing an explicit instance of IsNil. But this sounds=
 nonsensical to me, too. No instance should be choosing unless=
 the specific instance type is forced by the definition.=
 Otherwise, if there are two insances, which one would it=
 choose?

>- a ->=A0Bool (without quantification and with "IsNil a" among the=
 predicates).

   This is something I didn't understand either. Which=
 predicates?

   Thanx for your patience O:-)

   Salutaciones,
                        JCAB
email: jcab@roningames.com
ICQ: 101728263
The Rumblings are back: http://www.JCABs-Rumblings.com