It's also not clear to me that it is ethical to have a punishment be far more extreme than a crime. Sending someone to jail for 40 days for stealing $2.75 seems a little extreme. That could easily turn a poor person with a job into a homeless person with no job.
A fine feels more appropriate. Maybe free rides for those who legitimately can't afford the fare.
Crime in NYC did drop precipitously, but it's not clear that broken windows policing was the cause. It's been studied and debated a lot, but as far as I can tell there isn't a clear consensus. Here are some sources:
I suppose creating an interventionist near-utopia won't be so bad if we don't run into any other intelligent life. The ethics of intervention are complicated enough between humans, so I'm happy to defer worrying too much about the ethics of interfering with other intelligent life until we find it. And other than that, the Culture's post-scarcity near-utopia sounds pretty great, especially compared to the current state of humanity.
Yep, you are correct! The hardest parts of getting Flow and Hack to build on Windows are solved. For Hack, there's probably a long tail of small issues before a Windows build can be released, though.
Is Hack on Windows something that you'd use? Or are you asking out of curiosity?
It is. We have a large codebase we would like to migrate to Hack, but we also have a lot of developers who use Windows and the current experience with needing to boot a virtual machine just to check types doesn't really cut it.
I'm also a fan of namespacing variants, and I used it extensively on an OCaml representation of the SpiderMonkey AST. (Coincidentally, up until writing our own parser we were using pfff's JavaScript parser! Go pfff!). Anyway, here are some other useful things I found in OCaml along the way:
Without namespacing, you might be using mutually recursive type definitions like
type statement = ExpressionStatement of expression
and expression = FunctionExpression of statement list
to do this with modules you need to use recursive modules, like
module rec Statement : sig
type t = Expression of Expression.t
end = struct
type t = Expression of Expression.t
end
and Expression : sig
type t = Function of Statement.t list
end = struct
type t = Function of Statement.t list
end
One of the sucky things about recursive modules is that you cannot omit the signatures, however if your modules only include types then there is a shortcut that looks like
module rec Statement : sig
type t = Expression of Expression.t
end = Statement
and Expression : sig
type t = Function of Statement.t list
end = Expression