Hacker News new | ask | show | jobs
by jsjohnst 3480 days ago
While his vitriol was extremely hyperbolic, I get his point somewhat on obtuse syntax.

Take this example of Haskell from their docs:

  thenP :: P a -> (a -> P b) -> P b
  m `thenP` k = \s ->
     case m s of 
       Ok a -> k a s
	 Failed e -> Failed e
It doesn't matter how good you are in [insert almost any common language], you'll really struggle to understand that code.

It's my same objection to things like Coffeescript, if you think you are so much more productive not typing semantic tokens like ()s or {}s, then you need to lay off the coffee and get some sleep as you're clearly dillusional.

3 comments

> It doesn't matter how good you are in [insert almost any common language], you'll really struggle to understand that code.

To the extent that true, it's because of the weird historic moment between the mid 1990s and now where essentially every industrially popular general purpose language is from the C branch of the Algol family.

It's not really the whitespace (which is clear in semantics), and other than the lambda slash and the infix ticks, the whole thing is pretty clear from a Lisp background. (Well, I'm familiar enough with Haskell now that I'm not filtering it through some other language, but the similarity to Lisp is what helped it start to click early on for me, even though it's an ML descendant and not a Lisp descendant.)

We're actually starting to see more gains for non-Algol descended general purpose languages, so maybe the syntax shyness of the last generation or so of programmers will soon be a thing of the past, because knowing multiple languages won't so invariably be knowing multiple members of the same syntax family.

If you removed the middle paragraph, I'd wholeheartedly agree everything you said. Unfortunately I don't feel my prior Lisp experience helped me as much when I was starting off in Haskell as it apparently did you.
> It doesn't matter how good you are in [insert almost any common language], you'll really struggle to understand that code.

Perhaps I've been using Haskell too long but that code looks very clear to me.

And it looks slightly clearer when laid out correctly

  thenP :: P a -> (a -> P b) -> P b
  m `thenP` k = \s ->
     case m s of 
       Ok a     -> k a s
       Failed e -> Failed e
But this is not a fair test. There needs to be a control. Implement the same functionality in Python and then we'll talk about which language is clearer.
I copy-pasted directly from the doc page that layout, guess I should've proofread it to make sure alignment was right. Thanks!

As to the comment re: control / python, I'm sorry but it's so obvious to me the syntax would be more legible to most developers (since "most" use Algol descendent syntax languages) even if done somewhat poorly, I don't feel like taking the time. I welcome you to prove me wrong, I'll gladly stand corrected if so!

What?! How would you even write that combinator in Python? You can't possibly convince me it would be clearer!
Yes, it looks clear to me too. But you and I are Haskell programmers. That said, outside maybe OCaml, no other language I've written code in (which is about 26ish at this point) prepared me mentally to be able to grok the syntax.
We weren't talking about any of this.