[Haskell-cafe] New type of ($) operator in GHC 8.0 is problematic

Joachim Durchholz jo at durchholz.org
Sat Feb 13 11:31:25 UTC 2016


Am 13.02.2016 um 10:41 schrieb Bardur Arantsson:
> It's terrible and basically name-space only.

That's just "do one thing, and do it well".
Or, conversely, "just the namespace, look elsewhere for what you think a 
module system is".

I guess the worst problem with SML's module system is that it does so 
many thing all rolled into one.

 > What's even stranger is
> that it's an *open* namespace (apart from the standard ones, I believe?)
> which means that I can retroactively add a class in say,
>
>     org.spring.integration
>
> and access package-scope bits of the original org.spring.integration
> namespace.

Yes, but you get into all sorts of trouble when packaging, and all kinds 
of tools will detect that and your software will be seen as low-quality.
Also, you can't do this unintentionally, so it's not a source of bugs.
So while possible in theory, it does not happen in practice unless in 
the most dire circumstances, and even then it's not the workaround 
people choose because it's too painful.

> It's a pretty weird system that seems to be driven by Java's
> "one-class-per-file" mentality[1].

Nah, that's unrelated.

> Disclaimer: Java 9 is getting a new module system, Jigsaw, but I'm not
> really too familiar with what it actually does, so I won't comment
> beyond this disclaimer :).

Jigsaw is about the ability to define large-scale modules.
I doubt it's a good approach, but I guess I'll work with it and see 
whether that's really going to be the case.
The Java culture isn't so much about good theory but about good 
engineering, so it's quite possible that my fears are unfounded.

>> The only thing that sets Java apart is that the DNS namespace is used as
>> the basis, and that's not even a language rule, just a recommendation;
>> the fascinating thing is that a mere recommendation was enough to make
>> clear who's responsible for fixing a name conflict, and virtually
>> eliminate name conflicts from the Java world.
>
> Yes, *this* was a FANTASTIC idea and it's soooo simple once you're aware
> of it. (No sarcasm intended, btw.)

Agreed, but if you were designing a language in the pre-Java times, the 
DNS was not the global registry where every programming-related entity 
would have a globally unique name. Most companies didn't even know what 
a domain name is, let alone have it registered.
Java went public roughly at the time that the Internet^W^W HTTP took 
off, and I suppose the idea to use domain names as the global namespace 
was more of a lucky accident because the plan was to make Java the 
Lingua Franca of browser scripting, and they *had* to have a way to make 
all those dynamically-loaded modules coexist, and in the WWW, the domain 
names come naturally.

Had Java been planned to become the server language it is today, I doubt 
they'd have had that idea.

> Unfortunately, the Scala people seem to be tiring of the long names and
> are regressing towards just using top-level names like "play" and
> "argonaut" and such... :/

I think that's mostly exceptions for the really-well-known frameworks.
Similar to the "java.*" and "javax.*" namespaces.
I can understand why they prefer "play.*" over "com.playframework.*", 
but I don't really get why they say "argonaut.*" instead of 
"io.argonaut.*". Weird.

OT3H it's not a really serious problem. The DNS as namespace means you 
have a spot that's guaranteed to be free for your code, and as long as 
nobody uses a TLD for his package root, it's all fine.
Things could become ugly for the Play framework is somebody registers 
"play" as a new TLD. It would be a clearly a problem for the Play 
framework, not for the DNS, so at least the responsibilities for fixing 
the problem will be easy to assign. Or maybe the Playframework guys will 
get a chance at reserving whatever .play domains would collide with 
their package names, it's quite possible they'd get heard during the 
sunrise period of a hypothetical new .play TLD.

So... things will muddle through as usual, and the main benefit is that 
you can choose a DNS-based spot in the namespace and be guaranteed that 
nobody else can usurp it because you registered that domain. And if 
somebody publishes code in that part of the namespace anyway, they will 
get labelled as "misleading" or even "abusive" and will be forced to 
move elsewhere.

> [1] Yes, I'm aware that you can actually have multiple classes in a
> file. Almost nobody does that.

It's mostly useless because you cannot have multiple public classes in a 
file, the other classes need to be package-private. And almost nobody 
uses package-private because the visibility rules around that are 
complicated, i.e. it is almost never what you want and also bad for 
maintenance.


More information about the Haskell-Cafe mailing list