&gt; To fill an empty cup, you cons a cup and its contents.<p>That simply has the wrong type in mathematically civilized languages like Standard ML or Haskell.<p>&gt; The full cup will only get garbage collected if you do not reference it anymore.<p>This is orthogonal to functional programming. You can avoid the need for a garbage collector with substructural types.