1,913 karma · joined March 29, 2016
Truly an idiom for our age.
(Honestly, though, that website is amazing. The "idiot" was purely for effect.)
stack --install-ghc $whatever_command
which gets you the version of GHC you need to be able to run $whatever_command into ~/.stack if you don't have it. Much less brittle than a system-wide installation, and perfect for working with multiple GHCs. Anecdotally: I setup the Arch Linux machine I'm typing this on yesterday. I installed[1] Stack/GHC before xorg :)[1]: It was so that I could run Aura: https://github.com/aurapm/aura
class Effable t where
f :: forall d. Effable d
=> t -> d
instance intsAreEffable :: Effable Int where
f x = ???
(This is PureScript, though. Excuse the bad pun.) .bs-equalheight .bs-responsive .col-md-3
Checkmate, TSA. /sCan you ... can you order takeout from a Bloomberg terminal?
Bounds-checking errors and the like do happen, and in rare cases reach catastrophic proportions, as we saw today. Downplaying what happened in that kind of situation isn't quite right, but it's still victimless in a certain sense -- you're minimizing the PR damage to yourself while not exactly hurting any other party. But Uber's behaviour here is essentially an attempt to apply the kind of "mitigation" that a situation report for a security vulnerability documents to a human conflict. (Non-serious aside: do they have an in-house "Fowler incident report" being edited every ten minutes?) It'd be far more admirable if they could go the completely Homo economicus route and declare "We don't honestly care, as long as we're profitable, and we're going to do everything possible to combat this eventuality." or something along those lines that actually reflects what they think of this, but obviously that would be ... suboptimal.
Yes, Uber management may be (in fact, from the emails they're sending out to people "deleting Uber", they definitely are) suffering as a result, but the lack of a contrite "Yes, this happened, it shouldn't have" instead of the "This is contrary to our values, our ethos, and a few other words that conjure associations of fine, upstanding citizenship in our communities and such" (read "Lies!"), together with the obviously impartial steps they're taking to "investigate" the matter, make it difficult to find empathy for their pain here.
(Any strawmen or logically suspect arguments in the above are unintentional and I'd love being told about them. Damn, I'd use that for an HN signature if those were supported.)
I think using dried leaves saves the trouble of having to pick them off the tree because they just fall to the ground, but I'm a city boy and wouldn't know for sure. Might have to ask my father! :)
You could define A(I) = { } for a trivial example of a different sheaf A where the "data" (always an empty set, regardless of I) is very different from what it was in the case of F (the set of continuous functions on I).
In general, proving that something that looks like a sheaf really is one may be nontrivial. :)
In the special case that I outlined above, it certainly is easy to show that F satisfies those axioms, as you point out. And it is a sheaf (the sheaf of continuous real-valued functions on R) precisely because it does.
(Right?)
This is the first time that I saw a livestream where an abort happened, so I'm curious. Is the timer freeze standard?
For instance, suppose you have a sheaf F that assigns to every open interval I on the real line the set[1] F(I) of real-valued functions defined on it. If I write F(a,b) for F((a,b)):
* f(x) = x is in all the F(a,b), since it's defined everywhere on the real line
* f(x) = 1/(x-3) isn't in F(2.9, 3.1) or even F(1,5), but it is in F(4,5)
And so on. There's an axiom that says that if you have
* f in F(I)
* g in F(J)
such that f = g everywhere on the intersection of I and J, then there is in fact some function h defined all over I ∪ J (i.e. h ∈ F(I ∪ J)) which you can restrict to I and J to get f and g respectively. So "compatible functions can be stitched together", where "compatible" means "agree on overlaps".
Sheaves give you a language to coherently[0] talk about "partially-defined" functions such as 1/(x-3) above, to stitch them together, and go from the "local" to the "global" picture and back comfortably. This last point is actually a hallmark of mathematics in the last one or two centuries: for instance, consider some equation which you want to find integer solutions for. If you want to show it has no solutions, you can reduce both sides modulo some number and show that there are no solutions mod n, which means it is impossible to find any solutions to begin with. It is a much more deep fact (the Hasse principle) that if you can find solutions mod all n (and a real one), you can always solve the original equation! (I'm fudging a bit here: see [2] for details.)
(Quick plug: I have a short post that talks about these things here[3], as well as another on the "p-adic" numbers that appear in the Hasse principle.)
Sheaves are general enough ("data" can mean[4] almost anything!) that Paul Cohen used them to prove the independence of the axiom of choice[5] from the Zermelo-Fränkel axioms (which is hard set theory) even though they were created for geometry, broadly speaking: in particular, they were one of the tools with which Grothendieck and his collaborators powerfully recast algebraic geometry in the 20th century, giving birth to "scheme theory"[6], which is e.g. vital in modern number theory. (I should probably mention the standard example of Wiles' proof of the Taniyama-Shimura conjecture that settled FLT.)
Cool stuff.
[0]: excuse the pun
[1]: ring, really
[2]: https://en.m.wikipedia.org/wiki/Hasse_principle
[3]: https://mrkgnao.github.io/schemes-i/
[4]: Well, a sheaf can be defined as a certain kind of contravariant functor into a category, which one can think of as the "type" of our data.
That earned a chuckle.
https://billandpaige.files.wordpress.com/2014/06/dsc_6462.jp...