I would say there is plenty of reason. When we stop living by the laws we put in place, stop pledging allegiance to our country, stop solving problems that the people of the country face while simultaneously start pledging allegiance to a single man [1] who breaks those laws[2] and cares little about the situation of individuals in this country[3], we are definitely on the road to ending our democracy.
[1] New whitehouse/government employees are being asked when their moment of “MAGA revelation” occurred. This. is. not. normal.
[2] Trump is a convicted felon, adulterer, conman, etc...
[3] See his response to many crises in his first term including his initial and continued denial of Covid
True but terrestrial networks are offering generic service directly to consumers. Apple's deal with globalstar is fully part of apple's offer. I don't think they even mention globalstar.
It's also a USP for Apple in the mobile market right now.
> But the cons were substantial:
...
> This wouldn’t retroactively apply to existing packages.
Why is this substantial? My understanding is that packages shouldn't be touched once published. It seems likely for any change to not apply retroactively.
Maybe, maybe not. If you are on a bandwidth limited connection and you have a bunch of NPM packages to install, 5% of an hour is a few minutes saved. It's likely more than that because long-transfers often need to be restarted.
> you wouldn't have needed to tune your car radio at all
You still need to tune it but there are many "center frequencies" that can be tuned instead of just one. So, you wouldn't have to tune far but you would still have to tune :) If you had a knob like most radios in the 80's it would save you from cranking the knob several times to get the dial into the right range before fine-tuning.
I think the theory is that every car that has an FM radio has it tuned to something. So no matter what, as soon as you put on the FM radio, it would have the audio.
Yeah, until you have a 5 year old (probably me in this case in the 80s) that plays with random knobs on the dash when they get in the car. Is it volume? Is it the tuner? We’ll know once the car turns on!
> and (c) requires a language feature (sequence points) to disambiguate in which order side effects get executed. With Haskell, we just don’t have to care.
Reading up to this point, I had to chuckle a bit. I have struggled with the Haskell type system more than I care to admit; It's almost never "we just don't have to care" when comparing to most other popular languages.
That being said, this article does a nice job of gently introducing some of the basics that will trip up somebody who is casually looking through code wondering what *> and <*> and <* do. As usual, there is a steep learning curve because of stuff like this all over the codebase. If I walk away for a month, I need to revisit >>= vs >> and other common operators before I can be productive. It probably doesn't help that I never actually speak to a human about these concepts so in my head it's always ">>=" and not "bind."
I try to avoid >>= and >> (or *>) because I know it trips people up; do-notation is more than fine. The exception is when parsing with one of the parsecs where you get a lot of <* and *> usage and all the tutorials use those symbols.
But I like <|> , it feels very clear that it has a sort of "or" meaning.
Elixir doesn’t even need a special syntax — it gets Haskell’s LambdaCase as a natural consequence of case being just another function, and the pipe operator always chaining by the first argument.
Haskell’s >>= is doing something slightly different. ‘getThing >>= \case…’ means roughly ‘perform the action getThing, then match the result and perform the matched branch’
Whereas ‘getThing |> \case…’ means ‘pattern match on the action getThing, and return the matched action (without performing it).
The >>= operator can also be used for anything satisfying the Monad laws, e.g. your actions can be non-deterministic.
Pedantry: >>= can be used for any instance of the Monad typeclass. GHC isn't sufficiently advanced to verify that a given Monad instance satisfies the monad laws; it can verify that the instance satisfies the type definition, but for e.g. the identity law "m >>= return === m" the instance can still return something violating the law (not something substitutable with m).
Being able to pipe into def, defp, defmodule, if, etc. is fantastic! But apparently you say at least in the case of case, it's not a macro, and it's just a function which returns a monad—I guess it's the same effect afterall? Is that why people say Haskell can get away with lack of Lisp-style macros because of its type system and laziness?
I was wrong about this. Case is a macro (a special-cased macro even, defined at https://github.com/elixir-lang/elixir/blob/4def31f8abea5fba4...), not a function. It works with pipes because in the AST it's a call, unlike in Haskell where case is its own thing.
> I try to avoid >>= and >> (or *>) because I know it trips people up; do-notation is more than fine
Interesting. Probably it's just me, but I first learned monads using >>= (in OCaml), so at the beginning I found the Haskell do notation more confusing (and indentation rules didn't help). >>= is just a function and I understand its signature well. On the other hand, "do" is a syntactic sugar that I sometimes had to "mentally desugar" in some cases.
> It's almost never "we just don't have to care" when comparing to most other popular languages.
Struggling with Haskell type system is not an experience of somebody who has developed an intuition about Haskell type system. Granted, it is not a binary thing, you can have good intuition about some parts of it and struggle with others.
I think they way you put it is, while technically true, not fair. Those "most other" languages are very similar to one another. It is not C# achievement, that you don't struggle with its type system coming from Java.
This is like people struggling with Rust because of burrow checker, well, they have probably never programmed with burrow checker before.
Good intuition is a gift from god. For the rest of us, notational confusion abounds. Types are great. Syntax (not semantics) and notation can be a major bummer.
I think use makes master: the more you use it, the more mastery you will have and the better intuition will follow.
I struggled with the borrow checker because I’m smarter than it is, not because I haven’t worked with one before. Mainly I say “I’m smarter” because I’ve worked on big projects without it and never had any issues. Granted, I’ve only gotten in a fight with it once before giving up on the language, mainly because it forced me to refactor half the codebase to get it to shut up and I had forgotten why I was doing it in the first place.
Let's be realistic, rust is great, especially compared to C.
But it shifts the need to memorize undefined behavior with the need to memorize the borrow checker rules.
If you are dealing with common system level needs like double linked lists, rust adds back in the need for that super human level memory of undefined behavior, because the borrow checker is limited to what static analysis can do.
IMHO, the best thing Rust could do right now is more clearly communicate those core limitations, and help build tools that help mitigate those problems.
Probably just my opinion, and I am not suggesting it is superior, but zig style length as part of the type is what would mitigate most of what is problematic with C/C++
Basically a char myArray[10];, really being *myArray is the main problem.
Obviously the borrow checker removes that problem, but not once you need deques treeps etc...
If I could use Rust as my only or primary language, memorizing the borrow checker rules wouldn't be that bad.
But it becomes problematic for people who need to be polyglots, in a way that even Haskell doesn't.
I really think there's ways for Rust to grow into a larger role.
But at this point it seems that even mentioning the limits is forbidden and people end up trying to invert interface contracts, and leak implementation details when they're existing systems are incompatible with the projects dogma.
It is great that they suggest limiting the size of unsafe code blocks etc....but the entire world cannot bend to decisions that ignores the real world nuances of real systems.
Rust needs to grow into a language that can adjust to very real needs without and many real needs will never fit into what static analysis can do.
Heck C would be safer if that was the real world.
I really do hope that the project grows into the role, but the amount of 'unsafe' blocks points to them not being there today, despite the spin.
> But it shifts the need to memorize undefined behavior with the need to memorize the borrow checker rules.
With one massive difference: the borrow checker will tell you when you're wrong at compile time. Undefined behaviour will make your program compile and it will look like your program is fine until it's not.
> But it shifts the need to memorize undefined behavior with the need to memorize the borrow checker rules.
You have a choice: Fight the borrow checker on the front end until your code compiles, or chase down bugs on the back end from undefined behavior and other safety problems. No single answer there, it depends on what you're doing.
Cognitive load is a big issue. In Rust I find this comes in a couple of phases, the first being figuring out what the borrow checker does and how to appease it. The second is figuring out how to structure your data to avoid overusing clone() and unsafe blocks. It's a bit like learning a functional language, where there's a short-term adaptation to the language, then a longer-term adaptation to how you think about solving problems.
You mention doubly-linked lists, which are a good example of a "non-star" data structure that doesn't nicely fit Rust's model. But: for how many problems is this the ideal data structure, really? They're horrible for memory locality. Those of us who learned from K&R cut our teeth on linked lists but for the last 20 years almost every problem I've seen has a better option.
> IMHO, the best thing Rust could do right now is more clearly communicate those core limitations, and help build tools that help mitigate those problems.
rust-analyzer is the tool that does this. Having it flag errors in my editor as I write code keeps me from getting too far down the wrong road. The moment I do something Rust thinks is goofy, I get a red underline and I can pause to consider my options at that moment.
In my particular case, I was absolutely sure it was safe without having to test it. Would it remain so forever? Probably not because software changes over time.
In those cases what you are supposed to do is write your logic using unsafe, and wrap it with lifetime safe APIs. That way your "smartness" joins efforts with rusts, and not-so-smart people can use your APIs without having to be as smart.
Funny, but I remember the difference between `>>=` and `>>` even though I haven't written Haskell in a couple of years.
`>>=` passes to the right the value coming from the left, while `>>` drops it.
To give an example, you use `>>=` after `readFile` to do something with the contents.
You use `>>` after `putStrLn` since `putStrLn` doesn't return a meaningful value.
> The us vs them in your comment feels quasi-political and unfounded.
Yeah, I've noticed there's a lot of virtue signaling form some Europeans, especially amongst the wealthier Germans, Benelux, and Nordics who have this "holier than though" posture on how much better they are than Americans(wide brush stroke here) for being non-materialistic (also copium for their low skilled wages), while coasting on generational wealth inherited from those before them.
Well if you're so non-materialistic, why aren't dropping the prices of your housing so other people can actually afford to buy something instead of hoping to profiteer from them like those "greedy" Americans?
As always, the people lecturing you on how money doesn't matter, are those who already have money.
Just like those Germans laughing at Trump when he warned them about Germany's dependence on Russian energy in 2018. [1] They can be so smug and full of themselves sometimes.
I dunno — in the torrent of sludge that came and will come from the Trump administration, how is anyone supposed to distinguish an occasional nugget of truth?
Easy, you use your brain and critical thinking to process the message separately from the messenger and then do your own fact checking. But that's hard and your avenge person is too retarded to do any such research and it's easier just to laugh at Orange Man while being smug.
Like if the Germans would have invested as much brain power to look up where the energy of their industry is coming from and asses the threat of being depended on Russia, as much as they used to laugh at America's big military and at Donald Trump, they'd be in a better state.
Anyone with two working braincells knew Germany's position was vulnerable to Russia. Even EU leaders told them that, not just Trump but also Obama.
Maybe he would like to pretend he's surveyed 330+ million individuals and has assessed each with respect to materialism and ability to understand life.
> I briefly looked at …Gradle… The build configuration files seem to have too much unexplainable magic in them.
This is largely due to the use of groovy. When the Kotlin DSL is used instead, it can usually be introspected by (eg) IntelliJ. Otherwise, it’s pretty opaque.
Unless you know this, there's zero way you will come up with this by typing `configure` and using just auto-completion. Might as well use Groovy and a String for the name of the thing you're configuring. Good tooling would be able to auto-complete from there whether it's Groovy or Kotlin (or Java etc).
That wasn’t my experience a few years ago with a large groovy-dsl project. Since groovy will take a look in several different namespaces to automatically resolve things in a script, editors I tried had no hope of telling me what anything was.
Also, groovy allows modification of private instance variables which leads to … un-fun situations. I converted tens of thousands of lines of groovy to Kotlin. A lot of those lines were automated. Too many were not automatable for myriad reasons.
As far as the magic in Kotlin, I can easily click through all keywords and jump to the implementation in IJ. Groovy (at the time and in the project I was in) was utterly hopeless in this regard.
Groovy closure delegates' type can be declared, giving as much information as with Kotlin. The reason you couldn't follow the code was that the people who wrote those things either didn't declare types, or IntelliJ wasn't using the type declarations (I believe Groovy support in Gradle files is less good than in general Groovy files, where the IDE does support this). You're correct that some plugins will resolve things dynamically and those cannot be resolved by the IDE. But that's not the fault of the language, if you're going to rewrite in Kotlin with types, you could just as well add types to your Groovy declarations for the same result.
Searching Google for “Gravy Analytics breach” results in FTC action against said company for illegally tracking consumers. Among the results are mentions of HIPAA violations… which in 2025 USA is actually a really big deal.
For all of the “but I have nothing to hide” crowd, you need to modify your slogan to, “but I have nothing to hide, right now.”
I would like to add the following conditions to further illustrate how fraught that sentiment is.
- from the people currently in power
- from the laws as they currently stand
- given my understanding of all the laws that exist
- from a wacko down the street with a short fuse and weaponry
If you don't have something to hide, your life is lame. LOL
Seriously, though, what would the HIPAA violation be for location data? Knowledge of someone going to a doctor's office doesn't sound like a HIPAA violation. AFAIK, violations only relate to what is communicated between doctors (and other healthcare professionals) and patients.
Location data generated by your phone is not covered by HIPAA (source: [1]) whereas the location of a patient undergoing treatment is. Thus, there's nothing that stops a data broker inferring that you are visiting a psychiatrist or a reproductive health clinic and sharing that insight with buyers, but the clinic/doctor cant share that you were treated at such and such location since that is personal health information (PHI).
The web page below has quite some discussion on what this means for patient privacy and how to disable certain location services on your phone.
I ask because we barely understand our own star, the Sun. We know it has solar minima/maxima and we still track sunspots as a primary means of qualifying how we think it will affect us. We are still sending probes to get closer looks at the surface which is extremely dynamic.
In terms of biological and ecological complexity, a tree is vastly more complex, as it exhibits life processes, growth, interaction with other organisms, and adaptability.
In terms of physical processes and energy production, the sun is immensely complex in its own right, but it doesn't exhibit the same kind of dynamic, adaptive behavior that we associate with life.
Another point of view: it took over ten billion years for the first tree to form in the universe. The first stars were present only after a couple hundred million years.
There is no way to know this, universe can be chock full of trees of some form on certain type and position of the planet. Later than first stars for sure, but thats about it with our current knowledge
Our current knowledge points to the first planets appearing around one billion years after the big bang (heavy elements need to be bred in stars in sufficient quantities first and be ejected in super novae), and evolution taking another billion years to produce eucaryotic life, then another three billion for plants to form.
So while obviously we can't say for sure, I stand by my original statement when speaking in terms of orders of magnitudes. I think it's a sensible argument.
If we substitute something else in this argument, we can see that it’s trivially not true for arguing complexity:
You can have stars without lead, but you can’t have lead without stars; Lead (the element) is produced by stars but is itself not more complex than a star.
[1] New whitehouse/government employees are being asked when their moment of “MAGA revelation” occurred. This. is. not. normal.
[2] Trump is a convicted felon, adulterer, conman, etc...
[3] See his response to many crises in his first term including his initial and continued denial of Covid