<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
<div dir="auto">I think this is just a case of confusing unrelated concepts that use the same symbol.<br></div><div dir="auto"><br></div><div dir="auto">There is an operator named <span style="font-family: monospace, sans-serif;" class="">-></span> (for forming function types), but that's not what the exact same character sequence <span style="font-family: monospace, sans-serif;" class="">-></span> means in lambda syntax.<br></div><div dir="auto"><br></div><div dir="auto">The lambda syntax is roughly <span style="font-family: monospace, sans-serif;" class="">\args -> expr</span>. The arrow there is more like a keyword than an operator; it doesn't have precedence, it just separates parts of a code structure. Much like the `=` in a function or type definitions.<br></div><div dir="auto"><br></div><div dir="auto">The parsing rule for lambas <b>is</b> a bit weird, because there is deep ambiguity in how much of the code following the <span style="font-family: monospace, sans-serif;" class="">-></span> should be taken as part of the lamba's body. The rule that resolves the ambiguity is that the lamba's body extends as far as it can without causing a parsing error. So when you have multiple lambas occurring near each other, as in your example, usually the latter ones are inside the body of the first one, unless there are parentheses or the end of an aligned block or something else to force a specific place where the first one ends.<br></div><div dir="auto"><br></div><div dir="auto">But this isn't really the operator precedence system at work, it's the specific parsing rule for lambas syntax. Bing Copilot is giving you misleading information because when you ask about the precedence of <span style="font-family: monospace, sans-serif;" class="">-></span>, the only interpretation that can really make sense of that question is if you're talking about it as an operator, and it then gets distracted talking about operator precedence in general (and the way fixity declarations mean you can't necessarily tell an operator's precedence without the full context). But in lamba syntax (and case syntax, etc) the arrow simply isn't an operator, so none of this is really relevant.<br></div><div dir="auto"><br></div><div dir="auto">Ben</div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto">17 Mar 2024, 9:58 am by johns243a@gmail.com:<br></div><blockquote class="tutanota_quote" style="border-left: 1px solid #93A3B8; padding-left: 10px; margin-left: 5px;"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="auto">I was asking Bing Copilot questions to better understand the order of precedence in:<br></div><div dir="auto"><br></div><div dir="auto"><span style="color: rgb(0, 0, 0);"><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="font-size:17px" class="">sequence :: Monad m => [m a] -> m [a]</span></span></span><br></div><div dir="auto"><span style="color: rgb(0, 0, 0);"><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="font-size:17px" class="">sequence = foldr mcons (return [])</span></span></span><br></div><div dir="auto"><span style="color: rgb(0, 0, 0);"><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="font-size:17px" class="">             where mcons p q = p >>= \x -> q >>= \y -> return (x:y) <br></span></span></span></div><div dir="auto">I noticed that for evaluation (e.g. binding variables to real world data), the left most "->" seems to have it's lambda variables bound first but with regards parsing this left most "->" seems to be the least deeply nested which in a strick language would suggest a low order of precedence. In the summary part of bing's answer, bing actually said that "->" has the highest order of precedence but if you read the whole answer you see it is only for type construction where Bing specifically made claims of the order of precedence and in the other case (parsing & fixity), bing said that the fixity of "->" is not defined in the Haskell 98 report, and nuanced it by saying that the parsing rules depend on both fixity and associativity. <br></div><div dir="auto"><br></div><div dir="auto">Here is my Question to bing:<br></div><div dir="auto"><br></div><div dir="auto"><span style="color: rgb(0, 0, 0);"><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="font-size:17px" class="">> Related to the above there seems to be ambiguity in the<br>> phrase “order of precedence here”. With regards to evaluation<br>> the order -- in the case of mcons (shown above) -- the “->” <br>> operator seems to get bound first, with real world data.<br>> This suggests a higher order of precedence for “->” than<br>> the other operators. However, with regards to parsing the<br>> operator “->” is associated with less deeply nested brackets,<br>> which in a strict language would suggest a lower order of<br>> precedence, or equivalently in Haskell lingual, a lower fixity.<br>> Fixity is defined in Talb 2 at but this table doesn’t give the<br>> fixity for “->”. </span></span></span><span class="" style="box-sizing: border-box; color: rgb(41, 80, 111);"><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="font-size:17px" class=""><a target="_blank" rel="noopener noreferrer" href="http://www.haskell.org/onlinereport/decls.html#nested">www.haskell.org/onlinereport/decls.html#nested</a></span></span></span></div><div dir="auto"><span style="color:#1155cc" class=""><u><a target="_blank" rel="noopener noreferrer" href="https://www.pearltrees.com/s243a/question-evaluation-questions/id76447605/item582390761">https://www.pearltrees.com/s243a/question-evaluation-questions/id76447605/item582390761</a> <br></u></span></div><div dir="auto">and here is bing's answer:<br></div><p style="box-sizing:border-box"></p><div dir="auto"><span style="color:#000000" class="">> You’ve raised an interesting point regarding the perceived</span><br></div><div dir="auto"><span style="color:#000000" class="">> ambiguity in the phrase “order of precedence” when it</span><br></div><div dir="auto"><span style="color:#000000" class="">> comes to the -> operator in Haskell. Let’s delve into this</span><br></div><div dir="auto"><span style="color:#000000" class="">>  topic and clarify the nuances.</span><br></div><div dir="auto"><span style="color:#000000" class="">> </span><b style="font-family:OpenSansRegular,Helvetica,sans-serif;font-size:17px;color:rgb(0,0,0);box-sizing:border-box">1. Operator Precedence and Associativity:<br>> * </b><span style="color:#000000" class="">In Haskell, operator precedence determines</span></div><div dir="auto"><span style="color:#000000" class="">> the order in which operators are evaluated. It</span><br></div><div dir="auto"><span style="color:#000000" class="">> ensures that expressions are parsed unambiguously.</span><br></div><div dir="auto"><span style="color:#000000" class="">> * The associativity of an operator determines whether</span><br></div><div dir="auto"><span style="color:#000000" class="">> it is evaluated from left to right (left-associative) or from</span><br></div><div dir="auto"><span style="color:#000000" class="">> right to left (right-associative).</span><br></div><div dir="auto"><span style="color:#000000" class="">> * The -> operator (function type constructor) has a</span><br></div><div dir="auto"><span style="color:#000000" class="">> specific precedence and associativity.</span><br></div><div dir="auto"><span style="color: rgb(0, 0, 0); box-sizing: border-box;"><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="font-size:17px" class=""><b>> 2. Function Type Constructor (->) Precedence:<br></b></span></span></span><b style="font-family:OpenSansRegular,Helvetica,sans-serif;font-size:17px;color:rgb(0,0,0)">> * </b><span style="color:#000000" class="">The -> operator has the </span><b style="font-family:OpenSansRegular,Helvetica,sans-serif;font-size:17px;color:rgb(0,0,0);box-sizing:border-box">highest precedence</b><span style="color:#000000" class=""> among</span></div><div dir="auto"><span style="color:#000000" class="">> all operators in Haskell.</span><br></div><div dir="auto"><span style="color:#000000" class="">> It is used to specify a function’s type signature, such</span><br></div><div dir="auto"><span style="color:#000000" class="">> as Int -> Int -> Float.</span><br></div><div dir="auto"><span style="color:#000000" class="">> * Being right-associative, it means that function types</span><br></div><div dir="auto"><span style="color:#000000" class="">> associate from right to left. For example,</span><br></div><div dir="auto"><span style="color:#000000" class="">>  Int -> Int -> Float is equivalent to Int -> (Int -> Float).</span><br></div><div dir="auto"><span style="color: rgb(0, 0, 0); box-sizing: border-box;"><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="font-size:17px" class="">> </span></span></span><span style="color: rgb(0, 0, 0); box-sizing: border-box;"><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="font-size:17px" class=""><b>3. Parsing and Fixity:<br></b></span></span></span><b style="font-family:OpenSansRegular,Helvetica,sans-serif;font-size:17px;color:rgb(0,0,0)">> * </b><span style="color:#000000" class="">When parsing expressions, Haskell follows specific</span></div><div dir="auto"><span style="color:#000000" class="">> rules for each operator, including the -> operator.</span><br></div><div dir="auto"><span style="color:#000000" class="">> * The compiler determines how to group expressions based on the fixity (precedence and associativity) of operators.</span><br></div><div dir="auto"><span style="color:#000000" class="">> * Fixity declarations allow you to control how</span><br></div><div dir="auto"><span style="color:#000000" class="">> operators are parsed.</span><br></div><div dir="auto"><span style="color:#000000" class="">> *Unfortunately, the Haskell 98 Report does not</span><br></div><div dir="auto"><span style="color:#000000" class="">> explicitly list the fixity of the -> operator.</span><br></div><div dir="auto"><span style="color: rgb(0, 0, 0); box-sizing: border-box;"><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="font-size:17px" class="">> </span></span></span><span style="color: rgb(0, 0, 0); box-sizing: border-box;"><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="font-size:17px" class=""><b>4. Custom Operators and Readability:<br></b></span></span></span><b style="font-family:OpenSansRegular,Helvetica,sans-serif;font-size:17px;color:rgb(0,0,0)">> * </b><span style="color:#000000" class="">Custom operators (including symbolic ones)</span></div><div dir="auto"><span style="color:#000000" class="">> can indeed decrease readability and maintainability.</span><br></div><div dir="auto"><span style="color:#000000" class="">> * When encountering unfamiliar operators, it’s</span><br></div><div dir="auto"><span style="color:#000000" class="">> challenging to deduce their meaning solely from</span><br></div><div dir="auto"><span style="color:#000000" class="">> their names.</span><br></div><div dir="auto"><span style="color:#000000" class="">> * The arbitrary-looking names lack hints for understanding</span><br></div><div dir="auto"><span style="color:#000000" class="">> their purpose, especially for newcomers.</span><br></div><div dir="auto"><span style="color: rgb(0, 0, 0); box-sizing: border-box;"><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="font-size:17px" class="">> 5. </span></span></span><span style="color: rgb(0, 0, 0); box-sizing: border-box;"><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="font-size:17px" class=""><b>Using $ to Clarify Expressions:<br></b></span></span></span><b style="font-family:OpenSansRegular,Helvetica,sans-serif;font-size:17px;color:rgb(0,0,0)">> * </b><span style="color:#000000" class="">The $ operator is defined with very low precedence.</span></div><div dir="auto"><span style="color:#000000" class="">> * Writing f $ x is equivalent to f x, but it helps avoid</span><br></div><div dir="auto"><span style="color:#000000" class="">> parentheses.</span><br></div><div dir="auto"><span style="color:#000000" class="">> * By using $, you can explicitly indicate the evaluation</span><br></div><div dir="auto"><span style="color:#000000" class="">> order without relying on operator precedence.</span><br></div><div dir="auto"><span style="color: rgb(0, 0, 0); box-sizing: border-box;"><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="font-size:17px" class="">> </span></span></span><span style="color: rgb(0, 0, 0); box-sizing: border-box;"><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="font-size:17px" class=""><b>6. Conclusion:<br></b></span></span></span><b style="font-family:OpenSansRegular,Helvetica,sans-serif;font-size:17px;color:rgb(0,0,0)">> * </b><span style="color:#000000" class="">While the -> operator has the highest precedence,</span></div><div dir="auto"><span style="color:#000000" class="">> its behavior is influenced by associativity and context.</span><br></div><div dir="auto"><span style="color:#000000" class="">> * Fixity declarations (such as infixr 0 ->) can help</span><br></div><div dir="auto"><span style="color:#000000" class="">> control how operators are parsed.</span><br></div><div dir="auto"><span style="color:#000000" class="">> * Understanding operator behavior and using $ judiciously </span><br></div><div dir="auto"><span style="color:#000000" class="">> can lead to more idiomatic and maintainable code.</span><br></div><div dir="auto"><span style="color:#000000" class="">></span><br></div><div dir="auto"><span style="color:#000000" class="">> In summary, the -> operator’s precedence is indeed high,</span><br></div><div dir="auto"><span style="color:#000000" class="">> but its behavior is nuanced due to associativity and</span><br></div><div dir="auto"><span style="color:#000000" class="">> parsing rules. Fixity declarations and careful usage of</span><br></div><div dir="auto"><span style="color:#000000" class="">> operators contribute to code clarity.</span><br></div><div dir="auto"><span style="color:#000000" class="">></span><br></div><div dir="auto"><span style="color:#000000" class="">> For more details, refer to the </span><span class="" style="color: rgb(41, 80, 111); box-sizing: border-box;"><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="font-size:17px" class="">Haskell 98 Report</span></span></span><span style="color:#000000" class="">.</span><br></div><div dir="auto"><span style="color:#000000" class="">></span><br></div><div dir="auto"><span style="color:#000000" class="">> Feel free to ask if you have further questions or need additional clarification! 😊</span><br></div><div dir="auto"><span style="color:#000000" class="">>Learn more<br>> </span><span style="color: rgb(41, 80, 111);"><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="font-size:17px" class="">1 </span></span></span><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="color:#29506f" class=""><span style="font-size:17px" class=""><a target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/23553139/operator-and-function-precedence-in-haskell">https://stackoverflow.com/questions/23553139/operator-and-function-precedence-in-haskell</a><br></span></span></span><span style="color: rgb(41, 80, 111);"><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="font-size:17px" class="">> 2 </span></span></span><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="color:#29506f" class=""><span style="font-size:17px" class=""><a target="_blank" rel="noopener noreferrer" href="https://www.haskellsos.com/basics/what-order-would-haskell-evaluate-2-operands-of-the-same-precedence/">https://www.haskellsos.com/basics/what-order-would-haskell-evaluate-2-operands-of-the-same-precedence/</a><br></span></span></span><span style="color: rgb(41, 80, 111);"><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="font-size:17px" class="">> 3 </span></span></span><span style="font-family:OpenSansRegular, Helvetica, sans-serif" class=""><span style="color:#29506f" class=""><span style="font-size:17px" class=""><a target="_blank" rel="noopener noreferrer" href="https://devhubby.com/thread/what-is-the-precedence-of-and-in-haskell">https://devhubby.com/thread/what-is-the-precedence-of-and-in-haskell</a><br>> 4 <a target="_blank" rel="noopener noreferrer" href="https://studentprojectcode.com/blog/how-to-change-precedence-of-constructor-in-haskell">https://studentprojectcode.com/blog/how-to-change-precedence-of-constructor-in-haskell</a><br>> 5 <a target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/3125395/haskell-operator-vs-function-precedence">https://stackoverflow.com/questions/3125395/haskell-operator-vs-function-precedence</a><br>> 6 <a target="_blank" rel="noopener noreferrer" href="https://stackoverflow.com/questions/56202894/what-is-the-precedence-of-and-in-haskell">https://stackoverflow.com/questions/56202894/what-is-the-precedence-of-and-in-haskell</a><br>> 7 <a target="_blank" rel="noopener noreferrer" href="https://codereview.stackexchange.com/questions/120900/expression-parser-in-haskell-using-operator-precedence-table">https://codereview.stackexchange.com/questions/120900/expression-parser-in-haskell-using-operator-precedence-table</a><br>> 8 <a target="_blank" rel="noopener noreferrer" href="https://kowainik.github.io/posts/fixity">https://kowainik.github.io/posts/fixity</a><br>> 9 <a target="_blank" rel="noopener noreferrer" href="https://devtut.github.io/haskell/infix-operators.html">https://devtut.github.io/haskell/infix-operators.html</a><br>> 10 <a target="_blank" rel="noopener noreferrer" href="https://www.haskell.org/onlinereport/decls.html">https://www.haskell.org/onlinereport/decls.html</a></span></span></span></div><p></p><div dir="auto"><a target="_blank" rel="noopener noreferrer" href="https://sl.bing.net/gHzlncNjtLw">https://sl.bing.net/gHzlncNjtLw</a><br></div><div dir="auto"><a target="_blank" rel="noopener noreferrer" href="https://www.pearltrees.com/s243a/question-evaluation-questions/id76447605/item582390849">https://www.pearltrees.com/s243a/question-evaluation-questions/id76447605/item582390849</a><br></div><div dir="auto"><br></div><div dir="auto">I wonder how people would rate Bing's answer. <br></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></div></blockquote>  </body>
</html>