Andrew Coppin wrote:
I hang out on another forum that is populated by various kinds of computer geeks. There's a fair few programmers in there, as well as nerds of every degree. And yet, every time I post anything written in Haskell, everybody complains that it "looks like line noise".

Actually, none of these things were mentioned. The things people have *actually* complained to me about are:
- Haskell expressions are difficult to parse.

To anyone who doesn't know the language, this seems quite true. Haskell was designed with a hyper-minimalist syntax, whereas C/C++/Java are very heavy with syntactic boilerplate. I am a devout fan of the minimalism, but it is something of a barrier to entry for those unwilling to consider anything that doesn't look familiar.

We inherited our use of spaces for function application from Lisp and friends, so "foo bar baz" looks perfectly natural to functionalists. But to those used to seeing "foo(bar, baz)" the meaning attached to the spaces is alien. The 'difference' in meaning for the two spaces only drives the alienness home, since (ubiquitous) currying is not well known or practiced outside of Haskell. Even with functionalists ---of the OCaml and SML ilk--- this use of spaces can be confusing if noone explains that function application binds tighter than all operators.

Similarly, we use linebreaks to denote various things whereas the syntax-heavy languages require a semicolon or similar delimiter. We are in fortuitous arms here since we can use the redundant {;} notation to sell new folks. Though it is wise to use the notation with the semicolon trailing on the previous line:

    do {
        foo;
        bar;
        baz;
    }

rather than the more idiomatic leading version:

    do { foo
       ; bar
       ; baz
       }

Again, the minimalist version that omits the {;} which lends a meaning to whitespace that syntax-heavy users are not familiar with. Here I think is largely a question of knowing your audience; the explicit version is better for any audience with many non-Haskell folks, even if it's a functional audience.

We also allow for omitting parentheses in many places required by other languages. In particular, the case...of construct mentioned previously. The if...then...else construct can have similar problems, though they are more easily overlooked by foreigners. Again this is easy to correct for when talking with outsiders: just add redundant parentheses.

The meaning of = and how it differs from -> are also quite subtle. Pattern matching and guards, like currying, are concepts that are quite alien to users of most other languages. The simplicity of their syntax in Haskell probably serves to further confuse questions of the syntax associated with =. I know from experience that these simple ideas can be a tough sale. Few languages have the notion that defining a function is the same as any other 'assignment' and so most languages have radically different syntaxes for the two. This trait of treating functions as first-class citizens tends to have large brain-breaking capabilities-- moreso than passing functions as arguments, it seems.


All of these are just basic things about Haskell's syntax and have nothing to do with all the interesting higher-order stuff which is really novel. It is unfortunate that there are so many people, intelligent people even, who are so hidebound as to be unwilling to gloss over syntax, but sadly it is the way of things. To be fair to them, the meanings assigned to whitespaces are not the sort of thing which is trivial to intuit. Perhaps we need a _Guide to Reading Haskell (for non-Haskell Programmers)_?

--
Live well,
~wren
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to