3,837 karma · joined January 13, 2022
(Genuine question, I'm sure I lack all context.)
In the late 90s / early 2000s Internet radio would probably have made me think of RealPlayer, and shortly thereafter actual radio stations' own websites with embedded streams. Then I'd think of aggregators like the original iTunes, and now TuneIn.
It would certainly benefit from a single line atop the README that clearly stated what this actually does. I certainly don't think of IRC when I think of Internet radio.
The US attack on that school is atrocious and I condemn it. While possibly a war crime, it does not meet the definition of genocide, unlike Israel's conduct in Gaza, which certainly does. There's no evidence of recent US conduct amounting to genocide (much historical evidence vis-a-vis American Indians though).
To the extent you wish to penalise complicity in genocide, go for it, but I will notice if you're oddly selective in which genocides you apply that standard to, and which you don't. (Which countries traded with Burma during the Rohingya genocide? Do you know? Do you care?)
> brown children
What does the children's colour have to do with anything at all? Do we grade the severity of war crimes by the (perceived? assigned?) race of the victim? Horrific thought.
It's not prejudice when it's based on a post-facto assessment of the Russian government's mobilisation of their companies for obscene and evil goals like clamping down on free speech, persecuting LGBT people, or trying to destroy Ukraine.
"It's Russian and therefore it's out" is a valid stance in light of all the known consequences of using a Russian product. If Russian people do not like this, they are welcome to break their links to the Russian state by emigrating and founding companies elsewhere, or stay and overthrow their government. Either works for me.
Many Russians have learnt to keep quiet about politics so they can get ahead in Russia, and they seem to harbour some deep-seated delusion that everyone from abroad should play along with this for their own convenience and profit. They whisper 'no war' to one another, by which they mean Ukraine should surrender already, so that this whole unpleasantness (to them) blows over, and the rest of the world goes back to accepting their blood money. No.
Germany has been grappling with its own horrific genocide for a hundred years and still hasn't quite figured it out. Russia is, as of the time of writing, currently undertaking one. Come back in a hundred years, maybe we can talk about Russian products then.
Spending money to get people into editing Wikipedia that would never otherwise have done so seems like a very worthy goal to me.
I don't care about internal DEI if the job is managing sewerage systems, but this is a perfect example of a context where fostering diverse engagement is both rational and improves the end product.
Private companies ought to have the freedom to do business with whomever they like, but for essential public services, better to assume essential public infrastructure simply must not be offshored at all.
Any question asked would be edited beyond recognition (and usually into brash rudeness). Half the answers were demanding ever increasing proof of work, and the other half told the OP that they shouldn't even be trying to do what they're doing. The only useful thing were opinion based posts from people with domain expertise, and SO kept trying to ban and remove those. It was the least helpful place online, but the most accessible, and it survived for lack of alternatives.
I'm no AI booster, but answering simple questions about well understood topics is a perfect fit for it. Good riddance to StackOverflow.
I definitely don't think stdlibs should be changed often, but it seems fairly damaging to a language when things may be added to a stdlib but never removed, no matter how broken or misconceived (see C++).
Rust is a great language, but the poor stdlib + overreliance on crates + explosion of unvetted transient dependencies makes it a hard sell for a lot of projects.
Please start writing a blog, if you don't already. If I could compose a blog roll of people writing fun CS histories, I would replace my HN bookmark with it.
I began by noting that TS has literals and set theoretic types, and that this makes sense for a post-facto type system bolted on top of a dynamic language. Jaen showed up to inform me that TS has literals and set theoretic types, implying he hadn't read my post.
I noted that typed string literals are not generally considered desirable within strictly typed environments. "Parse, don't validate", etc. Jaen seemed to follow this up by aggressively trying to prove that TS is somehow "better" than Haskell. His arguments comprised the fact that TS has literals and set theoretic types (again, yes, this was is in my initial post), and a mixture of personal insults and just straight up nonsense (I wasn't the one to bring Zod into a discussion of type systems... ). At that point I did have a little fun with things, since it had become clear Jaen was not a constructive or good faith interlocutor.
Jaen's central misapprehensions seem to be that (a) I don't understand literals and set theoretic types, despite this whole thread being in reply to a post where I give examples of them in TS; and (b) that I care which type system is "better".
As I repeated a number of times above, TS' type system makes sense for a type system bolted onto a dynamic language. It's extremely useful when the underlying language has oodles of untyped structs flying every which way. Conversely, Haskell's type system makes sense within a holistic strictly typed environment. Structural typing would be a gaping hole in Haskell's strict type safety, which is kind of Haskell's whole thing. Neither system is better, each has its use. Different strokes for different folks.
I don't usually put much stock in upvotes, but I do note I seem to have the edge there. Seems that our esteemed panel of armchair referees respectfully dissent from your narrative, nvlled. :)
If you're looking for some objective rationale for this change, you're not going to find one. This is simply designed to make GCs much, much harder to get and dissuade prospective immigrants. That's the only goal.
Everything I said to you prior to my last message was fairly gentle. I'm not sure what response you were expecting to what you wrote at that point, which was to accuse me of disingenuous strawman arguments and ignorance. Perhaps you yourself would have benefited from a rule refresher?
> You seem to know what I'm doing better than I am
Apparently so! Trust me, it gives me no pleasure, and I'd rather I didn't.
> Again, I wasn't talking about runtime schemas, but types. I only mentioned runtime as a counterpoint to the false statement that TypeScript doesn't enforce this. Only reducing this to runtime checking is a fallacy, again.
My dear friend, this is almost completely incoherent.
I wish to strictly type myself as a function at this point, whereby your messages are my input, and void is my output. Zod, activate!
> these type system features were added by multiple experienced language designers for a reason
Oooh, an appeal to authority, where that authority isn't even named. I'll have you know a famous queen told me you're wrong on this, also for "a reason".
> TypeScript has several runtime-safe advanced validators based on its type system (most well-known being Zod), capable of enforcing types similar to what I provided.
Right, so TS typing is so amazing it requires runtime parser libraries from NPM, and Haskell is less sophisticated because it's not stringly typed.
You realise the entire, complete, exhaustive runtime schema for your zero-first non-empty integer array example looks like this in Haskell, right?
sch (0:_) = True
sch _ = False
That's a complete function that somehow manages to work without pulling in NPM dependencies. The best JavaScript minds of our generation remain baffled.> The Person/Wine example is a pointless strawman
> I didn't give practical examples to save space, obviously, it was just to disambiguate what I meant.
So when you use illustrative examples, it is to "disambiguate what you meant" (huh?), and when I do it, they're "pointless strawmen". A little hypocritical, no?
> a bit ignorant
Honestly, I don't think you know what you're talking about at all. You clearly hadn't even read my comment when you started replying with Python and TS examples... that were already in my comment.
It also really sounds like you're using string literals to type input without properly parsing it, which is just a terrible idea. Haskell's type system is designed precisely to protect you from this sort of mistake. [0] No, you're not always going to get what you expect. No, your JS program will never let you know that's the case. No, a sane type system does not require mainlining runtime parser libraries from the biohazardous oceans of NPM. A schema in Haskell is going to be significantly shorter and sounder than anything in Zod, and you don't need a library for it.
As I said above, TS' type system makes sense for a type system bolted onto a dynamic language post facto. TS needs to more tightly link (even mildly conflate) values and types, since it needs to do a lot of clever narrowing to figure out what mad ball of JS it is dealing with at any given time. Haskell does not operate under any such constraint.
> I don't see a productive continuation to this discussion.
Phew. Timesaver.
Of course the irony of all this is that I use TS daily, and Haskell quite rarely.
[0] https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-va...
> You can go `</br/r/r>`, if you are really into solidi
Love it.
No? What extensions does `A | B | C` require?
> Haskell has neither subtyping nor structural typing
Is subtyping back in? Good news for Java and C++.
Re structural typing, I would ask what behaviour you're after, specifically. For example, this is a valid, typed Haskell function for any two values that can be added, including any user-defined ones:
adder a b = a + b
If by structural typing you mean silently coercing types that the compiler deems structurally equivalent, then no, but I don't think many people writing Haskell would consider that desirable. A `Person` may have an age (40) and a `Wine` may have an age (2005), but you're not going to get sensible results if you start adding those two together, and your compiler should probably stop you.Structural typing is the sort of thing that is very valuable if you're bolting a type system onto a language with a cornucopia of untyped structs, like JS objects. It is comparatively much less valuable if you're working in a typed ecosystem to begin with, since you're not liable to have loose untyped structs floating around that require coercion.
> "integration/glue" type of programs
It does sound a lot like you're using string literals in lieu of parsing foreign input, which strikes me as a pretty bad idea. Particularly in a language like TS, which is not type safe at runtime, and which will happily ingest an unexpected value, silently coerce it in all sorts of fun and wacky ways, and cause behaviour far removed from what any static analysis of the TS source would suggest.
> You can type a non-empty array that starts with zero
Can you please name me any possible actual use for this? Especially given the type doesn't even exist at runtime and will never be enforced on input data, so this is a once-off check for comptime constants?
You have come into a room full of CS practitioners to announce to them that you alone understand what unions are. Never mind fifty years of industry practices and nomenclature - never mind the fact we all already know set theory and unlike you don't confuse set theoretic unions with tagged unions - all that can now be set aside because you discovered set theory last week and now no one understands unions except for you.
Can't wait for next week when you discover some new band, and you'll be in here telling us how no one gets music except for you. :P
My overall point is that Haskell's type system is sufficiently expressive (you may not have "A" | "B" | "C", but you do have A | B | C) that there's no obvious remaining use case for string literals, unless you're thinking of typing input by way of expected literals instead of actually parsing it, which is... a choice. :P
> Well, we disagree.
Most people here know the set theory definition of unions. It's simply a niche use, compared to the usual CS definition, which is the one used in the original article and now all the comments.
You're swimming upstream with a definition that doesn't reflect what is under discussion, which you decreed as though from on high, complete with the assertion that most people don't understand unions like you do. They do.
That Haskell snippet is just syntax sugar for Left(string) | Right(string), which is trivial in any language with unions.
Not clear why it would be an improvement over just naming the alternatives something meaningful, but if you're wedded to Left and Right, go for it.
"In the 1990s, 'hackers' would 'dial up' their flip phones to local BBSes (called 'phreaking'), where they played and exchanged small Flash games (the 'demo scene')." /s
Not that there's any complete guarantee that the US web will forever remain open and free (no such guarantee is possible), but it's significantly more likely there than here. The state of the open web worldwide is pretty depressing. :(
[0] Mullvad, not the bad ones. Though with mandatory ISP-level retention of browser history here, pretty much anything is an improvement for privacy.