foldlでunzip

MLプログラミングの基本:リスト処理と多相関数(SML# とCで始める本格的プログラミング入門 第11回) を観た。

ここまで全部の回を観ている。 最後の練習問題をちょっと考えてみて

fun unzip l = 
  (foldl (fn ((a, b), t) => a::t) nil (rev l), 
   foldl (fn ((a, b), t) => b::t) nil (rev l))

と書いてみたが、こんな効率の悪いことするわけがないなと思い直して

fun unzip l =
  foldl (fn ((ha, hb), (ta, tb)) => (ha::ta, hb::tb)) (nil, nil) (rev l)

とする。これくらいの最適化は自動で可能な気がするので大して効率は変わらなかったりして。