The difference is surprising. Digging deeper, the US shop does not include shipping or taxes. To get an idea, I tried for CA and that already adds $12. That's already $38 without custom tax and VAT.
Fully charging the battery can cause it to age more quickly and lose capacity. Limiting charge level helps to protect it, especially when it's always connected to a power supply and don't need the battery that much.
if the li-ion is kept < 4.25v that should be no issue. I don't know why overcharging is even considered a thing (100% should be 4.22v or so for a standard li-ion cells). You can keep all tool batteries at around 4.2v (fully charged), and nothing happens - they don't degrade.
What actually kill batteries is overcharging (which has to be done on purpose in the electronics) and heat, having internals over 60C is where the real issue is.
I think phones are the 1st ones that started overcharging just to ensure lower life expectancy of the device... and of course much better autonomy during the 1st impressions.
It's interesting but not very practical. It's an "algebra of types" with only constants, no variables, since C does not have type variables. Thus it misses much of the point of algebraic data types in a language like Haskell (deep composability and generics with very little code to write).
Take one of the most basic sum types in Haskell's base library, Maybe:
data Maybe a = Nothing | Just a
This simple construction gives you the ability to write functions over optional values and avoid the issues with null pointers. This would be an amazing feature to have in C but it can't be achieved due to C's very limited type system.
I used to define `Maybe` in C as a macro over a tagged union. It really unveiled a number of logic errors at compile-time, but the issue of course is to use this kind of metaprogramming sanely. E.g., instantiating `Maybe` to some other macro `T(a)`, where `a` is some other (concrete) type, would already cause a headache.