3 ms·
> People spend time on this because Haskell syntax is deeply unpleasant to a lot of people, including myself. I can understand that the syntax may be unpleasan
by chriswarbo 10y ago
> People spend time on this because Haskell syntax is deeply unpleasant to a lot of people, including myself.
I can understand that the syntax may be unpleasant, but I don't think having to memorise even more precedence rules makes a language more pleasant.
When I read and write Haskell, my default "mode" is to see whitespace as function application, i.e. if I see "A B" then I assume "A" is being applied to "B". Hacks like "A $ B" interfere with this, since I have to mentally back-track and re-parse them as "$ (A) (B)".
> I've forgotten the $ in some usage of do or a final argument lambda twice in the last week even.
This is exactly the kind of thing I was lamenting. Rather than (ab)using "$", why not do the more natural thing, which every other language does, and use parentheses for grouping?
Instead of "forgetting the $" in
atomically do
v <- readTVar tv
writeTVar tv $! v + 1
Why not use parentheses for the job they're designed for, and write:
atomically (do
v <- readTVar tv
writeTVar tv $! v + 1)
Likewise, for
withForeignPtr fptr \ptr -> c_memcpy buf ptr size
You can use parentheses and never "forget the $"
withForeignPtr fptr (\ptr -> c_memcpy buf ptr size)
Parentheses are a universally understood syntax for grouping, they're supported in editors (e.g. finding matching pairs, checking if they're balanced, etc.), they always work in the same way, have no interference with other constructs or edge-cases, etc.
Don't get me wrong, the "$" function is really useful, for example in "map ($ arg) [func1, func2, func3]", but I don't see the point of abusing it to avoid parentheses. I do sometimes use it myself, but whenever there are multiple infix functions around, I'll tend to use "redundant" parentheses for grouping.
- cousin_it 10y agoSyntactically significant indentation doesn't mix well with parentheses. (That's why Python doesn't have multiline lambda, for example.) And Haskell's rules for indentation are much more complicated than Python's, so the interactions with parentheses are even worse. I'm not sure there's any single person who really understands all the edge cases. It's a complete clusterfuck, they better start afresh. C-style parentheses and curly braces are so much better for parsing, copy-paste, automatically generated code, etc.
- chriswarbo 10y ago> C-style parentheses and curly braces are so much better for parsing, copy-paste, automatically generated code, etc. Firstly, to get this out of the way, you shouldn't be using significant indentation when generating code unless you have a good reason; use parentheses, curly braces and semicolons instead https://en.wikibooks.org/wiki/Haskell/Indentation#Explicit_characters_in_place_of_indentation https://en.wikibooks.org/wiki/Haskell/Indentation#Explicit_c... Now, I wouldn't say parentheses and offside rules "don't mix well", but I'll grant that there are interactions to keep in mind. It's true that Haskell's indentation edge-cases are unfathomable, although thankfully I've never run into any. I have no strong preferences either way regarding significant whitespace, as long as there's an "escape hatch" for code generation (i.e. the braces and semicolons I linked to above). Regarding Python, its lambdas aren't "single line", they're "single expression"; that expression can cover as many lines as you like (e.g. see my SO answer http://programmers.stackexchange.com/a/252546/112115 http://programmers.stackexchange.com/a/252546/112115 ). When learning Haskell, after being a long time Python programmer, I used to think Haskell's indentation rules were complicated. These days, I find it awkward to indent Python code, and end up second-guessing the interpreter a lot. Maybe that's because I'm fond of using 2D code layout and vertical alignment to indicate relationships between lines, which is quite natural in Haskell. Python's indentation seems to be limited to counting blocks, so it's hit or miss whether adding extra spaces to align things will cause it to choke or not.