関数型言語とコンテナ

Haskellの詰め碁プログラムを読ませていただいて、少しずつ文法が頭に入っていきます。
Squeakで碁盤を作ったときは2次元アレイを実装して実現しましたが、このプログラムではIntMapを使っています。なるほど、再帰の中で碁盤を更新すると碁盤がどんどんコピーされるはず。アレイで実装したら大変。
そういえば、LISPも、APPENDよりCONSとかいう話が書いてあったような気がするなー。
でも、いつもコピーするのかな。なんかバインドの寿命を解析すれば最適化できるような気もする。
処理系のことをよく理解しないと速いコードは書けないというのはいつの世も一緒でしょうか。