<div dir="auto">This is the dreaded monomorphism restriction, which is turned on by default in modules but turned off by default in GHCi. Because your function is not "syntactically" a function (i.e., there are no arguments to the left of the = sign), and has no type signature, the type checker insists on it having a monomorphic type. Unless there's a use of it in the module forcing it to a particular type, the defaulting rules come into play, and a variable with a `Num` constraint defaults, by default, to `Integer`.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Oct 21, 2021, 2:41 PM Matthias Güdemann <<a href="mailto:matthias.gudemann@gmail.com">matthias.gudemann@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi cafe,<br>
<br>
today while explaining lambda functions I came across this case which<br>
I don't really understand.<br>
<br>
This is what I get using ghci<br>
<br>
λ> :t (\a b -> a + b)<br>
(\a b -> a + b) :: Num a => a -> a -> a<br>
<br>
but when loading a .hs file with just this function (without signature)<br>
<br>
add = \a b -> a + b<br>
<br>
I get<br>
<br>
λ> :t add<br>
add :: Integer -> Integer -> Integer<br>
<br>
but I can explicitly define add to have this type:<br>
<br>
add :: Num a => a -> a -> a<br>
add = \a b -> a + b<br>
<br>
Also ghc infers this polymorphic type for example for<br>
<br>
add0 a = \b -> a + b<br>
<br>
Why is the type of add without a signature inferred to Integer and not Num a?<br>
<br>
Best regards<br>
Matthias<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote></div>