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