Humans make errors. The more a human has to do, the more errors he makes. Therefore, there are two things a language can do:
- Help detect errors early, e.g. through a strong type system. This has been covered by other answers.
- Reduce the amount of work the human has to do.
The second point isn't simply about terseness. "Work" the human has to do isn't just the typing of the code. A lot of the work is in mapping from your idea of how something works to a way of expressing that in the code.
As a consequence, the more directly your ideas map to constructs of the programming language, the less translating you have to do, and the fewer errors you introduce in that translation. For example, in a language without higher-order functions, if you have a list of things and you want a list of things that are derived from the original things, you need to translate from the abstract idea "give me a list of derivatives of things in another list" to "create a list; go over the original list; compute the derivative of the current element; add it to the target list" and then translate that into code like
result = new List();
for each element in source { // what if you don't even have foreach?
result.add(derive_from(element));
}
In a language that has higher-order functions, you can more clearly express your idea, because you only have to translate it to "use the thing that gives me a list with elements corresponding to another list; give it the way to derive a new element", or in code:
result = map(source, derive_from);
The code is succinct, but more importantly, it more directly expresses the intention. There was less mental translation, and thus less room for error.