<turbo-stream action="append" target="posts_list"><template>    <div class="postbit" id="105715" data-post-id="105715">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="OvermindDL1" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/OvermindDL1/120/2677_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  OvermindDL1
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="dogweather" data-post="28" data-topic="16366">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/dogweather/48/1906_2.png" class="avatar"> dogweather:</div>
<blockquote>
<p>That syntax, which doesn’t differentiate between the function and the operands, is not a product of top-down design, but rather bottom-up implementation leakage. (The language being based on simple curried functions.)</p>
</blockquote>
</aside>
<p>Sure it differentiates it fine, the first token is the function, the rest are the arguments, that is not implementation leakage but rather just getting rid of superfluous things like commas that are just noise in ‘getting work done’, a <em>lot</em> of languages use this pattern of function calls, including ones without automatic currying.</p>
<aside class="quote no-group" data-username="dogweather" data-post="28" data-topic="16366">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/dogweather/48/1906_2.png" class="avatar"> dogweather:</div>
<blockquote>
<p>Coding in Haskell often feels like JVM Bytecode - a syntax defined according to the needs of the underlying machine.</p>
</blockquote>
</aside>
<p>Eh, not really, more I’d say it feels like it wraps the type system in most case, which is a bit of a mixture of sometimes conflicting ideas (hence why I prefer OCaml’s type system).</p>
<aside class="quote no-group" data-username="dogweather" data-post="28" data-topic="16366">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/dogweather/48/1906_2.png" class="avatar"> dogweather:</div>
<blockquote>
<p>Instead - interfaces, abstractions, classes, and objects (if OO).</p>
</blockquote>
</aside>
<p>Interfaces/abstractions is something haskell does quite well (though not really in my preferred way).  Classes/Objects from the traditional OOP world (not true OOP as it was originally defined, though smalltalk does this better than most) is useful in some cases, but it is also way <em>WAY</em> overused in places where it is just not suited, and that is when you start running into conceptual-hell (unable to follow the code flow because of how the poorly designed abstractions confuse which path code can take through the object calls) and the thousand-paper-cuts-of-death (OOP style abstractions are hell to optimize so you end up doing a lot of indirect function calls on the machine, which is death for performance-sensitive programs that overuse virtual calls).</p>
<aside class="quote no-group quote-modified" data-username="mmport80" data-post="31" data-topic="16366">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/mmport80/48/8995_2.png" class="avatar"> mmport80:</div>
<blockquote>
<p>Larger abstractions (e.g. Elixir behaviours) are just records with lambdas…</p>
</blockquote>
</aside>
<p>Actually BEAM Behaviours are more like typed module interfaces.  These worked <em>really</em> well with tuple calls that were removed just recently.  It’s a great common OCaml idiom that is trivially optimizable but utterly fantastic at abstractions (unlike OOP abstractions).</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="105715" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/the-complexity-of-haskell-vs-elixirs-simplicity/16366/32">Post #31</a>
	                </div>
	            </div>
              <div id="likers-container-105715" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="105715"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #31"></div>
  </section>
</div>
    <div class="postbit" id="105788" data-post-id="105788">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="pera" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/pera/120/10542_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  pera
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>Sorry but I couldn’t disagree more with this comment: there are few languages less “hacky” and with fewer leaky abstractions than Haskell. Syntax-wise the ML-family of PLs is hard to beat as their designers reached a global optima when considering minimalism and usability. Just take a look at the BNF definition of Haskell 98 and compare it to any other language <img src="https://forum.elixirforum.com/images/emoji/apple/slight_smile.png?v=15" title=":slight_smile:" class="emoji" alt=":slight_smile:" loading="lazy" width="20" height="20"></p>
<p>Of course, all these conversations are mostly based on personal opinions… but I don’t think your example provides a well-founded criticism against Haskell, at least from a language design perspective: when Milner designed ML in the mid 70’s he wanted for various good reasons, to have both the lambda calculus notation for function application and also infix notation for standard algebraic expressions / boolean relations. This was a deliberated decision that worked fantastically well. Then, to allow extensibility, its descendants included ways to define your own infix functions, and in the case of Haskell with some constrains for which characters are allowed in their names. Back to your example, if <em>o</em> was an operator it would be for instance something like <em>+</em>, or <em>&amp;&amp;&amp;</em> for an user-defined one, making the operands quite evident. There is no need to add any additional tokens into the grammar rules.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="105788" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/the-complexity-of-haskell-vs-elixirs-simplicity/16366/33">Post #32</a>
	                </div>
	            </div>
              <div id="likers-container-105788" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="105788"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #32"></div>
  </section>
</div>
    <div class="postbit" id="108922" data-post-id="108922">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="xnukernpoll" src="/assets/icons/user-9f439610.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  xnukernpoll
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>My favorite saying about Ocaml (applies to any ML really) is Ocaml is the velvet underground of programming languages there weren’t a lot of fans, but all of them went on to create their own PL.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="108922" data-batch-url="/posts/batch_likers">
                        4
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/the-complexity-of-haskell-vs-elixirs-simplicity/16366/34">Post #33</a>
	                </div>
	            </div>
              <div id="likers-container-108922" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="108922"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #33"></div>
  </section>
</div>
    <div class="postbit" id="108953" data-post-id="108953">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="dogweather" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/dogweather/120/1906_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  dogweather
                    <span class="op-star" title="Thread Starter">
                      <img alt="OP" class="op-star-icon" src="/assets/thread-icons/thread-icon-thread-starter-df91e872.png" />
                    </span>
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<aside class="quote no-group" data-username="pera" data-post="33" data-topic="16366">
<div class="title">
<div class="quote-controls"></div>
<img alt="" width="24" height="24" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/pera/48/10542_2.png" class="avatar"> pera:</div>
<blockquote>
<p>there are few languages less “hacky” and with fewer leaky abstractions than Haskell.</p>
</blockquote>
</aside>
<p>After spending hours reviewing the 10-15 conflicting ways of error/exception handling, I’m now rewriting half the functions in my application because there’s no abstraction for this. And now I’ll have half my app in “Monadic Either”, half not, and a few scattered functions non-Monadic either because they’re consumers of partially applied monadic functions.</p>
<p>I’ve got as many examples of implementation leakage as the day is long.</p>
<hr>
<p>Bonus annoying implementation leak: When writing HSpec tests and refactoring, moving them around, the syntax changes depending on whether there is one test in a section, or more than one. (A <code>do</code> is present or not.) Straight up implementation-based hack here.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="108953" data-batch-url="/posts/batch_likers">
                        1
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/the-complexity-of-haskell-vs-elixirs-simplicity/16366/35">Post #34</a>
	                </div>
	            </div>
              <div id="likers-container-108953" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="108953"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-standard-post cat-standard-post" title="Post #34"></div>
  </section>
</div>
    <div class="postbit" id="206425" data-post-id="206425">
  <section>
    <div class="post-wrap">


					<div class="post-header">
		        <div class="user-avatar">
		          <img alt="conradwt" src="https://forum.elixirforum.com/user_avatar/forum.elixirforum.com/conradwt/120/19105_2.png" width="120" height="120" />
		        </div>
					
						<div class="user-details">
		          <div class="user-name">
		            <h3>
                  conradwt
                  </h3>
		          </div>
						
						</div>
					
					</div>

	        <div class="thread-main">
	            <div class="post-body" data-turbo="false">
								<p>As someone that was considering Haskell a few months ago and coming from a Rails ecosystem, I must say that have experienced almost all of the issues presented in the video.  Thus, I have decided to take the most pragmatic route by simply using Elixir, Phoenix, and Elm.  It’s not perfect but I feel that it’s an upgrade from using Rails especially when one is talking about concurrency, fault tolerance, and overall performance.</p> 
	            </div>

	            <div class="base-line">
	                <div class="thread-counters">
	                    <span class="thread-count count-likes js-likers-trigger" title="Likes" data-post-id="206425" data-batch-url="/posts/batch_likers">
                        2
                      </span>
                      <!-- <span class="thread-count js-solved-indicator" title="Marked as solution"></span> -->
	                </div>
	                <div class="go-to-post">
	                  <a title="Go to post" alt="Go to post" href="https://forum.elixirforum.com/t/the-complexity-of-haskell-vs-elixirs-simplicity/16366/36">Post #35</a>
	                </div>
	            </div>
              <div id="likers-container-206425" 
                   class="likers-container"
                   data-first-post="false"
                   data-batch-url="/posts/batch_likers">
                   <div class="likers-placeholder" 
                     data-likers-post-id="206425"
                     data-batch-url="/posts/batch_likers">
                  <div class="post-likers"></div>
                </div>
              </div>
	        </div>
			

    </div>

    <div class="triangle-top-right type-last-post cat-last-post" title="Last post!"></div>
  </section>
</div>
</template></turbo-stream><turbo-stream action="replace" target="load-more-container"><template><div id="load-more-container" class="load-more-container">
    <span class="all-loaded">— All posts loaded —</span>
</div></template></turbo-stream>