title: What's the difference between abstraction and generalization?
body: <p>I understand that abstraction is about taking something more concrete and making it more abstract. That something may be either a data structure or a procedure. For example:</p>
  
  <ol>
  <li><strong>Data abstraction:</strong> A rectangle is an abstraction of a square. It concentrates on the fact a square has two pairs of opposite sides and it ignores the fact that adjacent sides of a square are equal.</li>
  <li><strong>Procedural abstraction:</strong> The higher order function <code>map</code> is an abstraction of a procedure which performs some set of operations on a list of values to produce an entirely new list of values. It concentrates on the fact that the procedure loops through every item of the list in order to produce a new list and ignores the actual operations performed on every item of the list.</li>
  </ol>
  
  <p>So my question is this: how is abstraction any different from generalization? I'm looking for answers primarily related to functional programming. However if there are parallels in object-oriented programming then I would like to learn about those as well.</p>