1,004 karma · joined July 4, 2014
Strictly speaking you can already do this using multiple tracks, but having a dedicated workflow will make it much easier.
- Moving away from config and plugins in VimL, which is extremely idiosyncratic and awkward to use, towards lua and other languages via rpc
- Long term health of the project - neovim feels like a truly community driven project, whereas Vim seems bottlenecked by Bram and his specific desires. Neovim has also gone to great lengths to make the source easy to maintain long term.
- inccommand (https://neovim.io/doc/user/options.html#'inccommand')
- saner defaults
The general point is right though. This is an issue with any terminal program that either doesn't allow selection of text, or has a system for selection of text that's separate to that of the terminal emulator.
Not sure how to feel about the goal of vscode plugin compatibility. I'd hope for a vim based ide to kind of "be its own thing".
But this is the kind of reasoning that leads to the situation in npm of thousands of tiny libraries such as "leftpad" that many systems programmers are so derisive of.
class Convert a b
requires MultiParamTypeclasses new Customer()
should return something valid? I think the FP way would be to disallow constructor overloads with no arguments, as really, there's no reasonable thing to be done here. If you don't have all the necessary information to initialize a customer yet, you don't get to initialize one, and you pass around a partially applied constructor function instead.ie, The argument is that (in pseudocode):
Customer(name = "Jimmy", address = null)
is not really a customer if address is a necessary piece of information, so we should distinguish at the type level by passing around a function that takes the address and returns the correctly initialized Customer like so \addr -> Customer(name = "Jimmy", address = addr)
Admittedly, this prevents you from accessing name until you provide an address, but I don't think there are many valid use cases where you want to access data before the Customer value is corrrectly initialized. I'd consider this a code smell to be refactored. head :: [a] -> a
in Prelude was a mistake, and the default should be to return a Maybe/Optional. Beginners are generally advised to avoid head, and all other partial functions in the Prelude, such as tail and the indexing operator, wherever possible, and rely on pattern matching instead, which is generally sufficient and more idiomatic for the relevant use cases. I agree that having the option to use a partial function is useful, escape hatches are important, but it shouldn't be the go to.Nonempty was just a simple example. You're right that it's not very commonly used (probably because it's not in Prelude), but the general culture of writing type safe interfaces and pushing guarantees to compile time %100 is a thing. A commonly used, more complicated example might be Servant, which is a web library which statically ensures your implementation meets an API spec.