<div dir="ltr"><div class="gmail_default" style="font-family:georgia,serif;font-size:small">I'm curious as to the intended meaning of</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_default" style="font-size:small"><font face="monospace, monospace">let f g = g . g</font></div></blockquote><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><div class="gmail_default" style="font-size:small"><span style="font-family:georgia,serif">Without reading further down, I immediately thought: "composing </span><font face="monospace, monospace">g</font><font face="georgia, serif"> onto </font><font face="monospace, monospace">g</font><font face="georgia, serif"> must require that the argument and result types (domain and range) of </font><font face="monospace, monospace">g</font><font face="georgia, serif"> must be identical".</font></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small">Then, when I read</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><div class="gmail_default" style="font-size:small"><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_default" style="font-size:small"><font face="monospace, monospace">f sum</font></div></blockquote></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><div class="gmail_default" style="font-size:small"><span style="font-family:georgia,serif">I don't know what that means, given that </span><font face="monospace, monospace">sum</font><font face="georgia, serif"> is [1] "a function of two arguments" yielding a single value (or, if I want to have my daily dose of curry, </font><font face="monospace, monospace">sum</font><font face="georgia, serif"> is [2] "a function of one argument yielding a (function of one argument yielding a single value)".</font></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><div class="gmail_default" style="font-size:small"><span style="font-family:georgia,serif">With either reading, I don't know how to reconcile </span><font face="monospace, monospace">sum</font><font face="georgia, serif"> with the expectation on the argument to </font><font face="monospace, monospace">f</font><font face="georgia, serif">.</font></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small">I think that's what the compiler is saying as well.</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><div class="gmail_default" style="font-size:small"><div class="gmail_default"><font face="monospace, monospace">    Expected type: (a -> a) -> a -> a</font></div><div class="gmail_default"><font face="monospace, monospace">      Actual type: a -> a -> a</font></div><div class="gmail_default" style="font-family:georgia,serif"> </div></div><div class="gmail_default" style="font-size:small"><span style="font-family:georgia,serif">The "expected type" expression seems to match what I expected from the definition of </span><font face="monospace, monospace">f</font><font face="georgia, serif">, and the "actual type" expression seems to match reading [2].</font></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small">So I'm wondering how that aligns with what you intended to express.</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small">-jn-</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Jan 3, 2016 at 7:31 AM, Julian Rohrhuber <span dir="ltr"><<a href="mailto:julian.rohrhuber@musikundmedien.net" target="_blank">julian.rohrhuber@musikundmedien.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">The function g, when called with a binary function returns a type error which I’d really like to understand: why is this type “infinite" rather than just incomplete or something similar? I would have expected some kind of partial binding. Can someone help me with an explanation?<br>
<br>
Prelude> let f g = g . g<br>
Prelude> let sum x y = x + y<br>
Prelude> f sum<br>
<br>
<interactive>:14:3:<br>
    Occurs check: cannot construct the infinite type: a ~ a -> a<br>
    Expected type: (a -> a) -> a -> a<br>
      Actual type: a -> a -> a<br>
    Relevant bindings include<br>
      it :: (a -> a) -> a -> a (bound at <interactive>:14:1)<br>
    In the first argument of ‘f’, namely ‘sum’<br>
    In the expression: f sum<br>
<br>
<br>
With a similar call using lambda expressions, the error is different:<br>
<br>
Prelude> (\x y -> x + y) . (\x y -> x + y)<br>
<br>
<interactive>:32:1:<br>
    Non type-variable argument in the constraint: Num (a -> a)<br>
    (Use FlexibleContexts to permit this)<br>
    When checking that ‘it’ has the inferred type<br>
      it :: forall a. (Num a, Num (a -> a)) => a -> (a -> a) -> a -> a<br>
Prelude><br>
<br>
<br>
<br>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature">Beauty of style and harmony and grace and good rhythm depend on simplicity. - Plato</div>
</div>