OCamlの罠

ソフトウェアの授業の課題のソーティングプログラムをOCamlで書き始めてから、度重なるStack overflowに悩むこと1週間。ファイル読み込み時のstack overflowは普通に末尾再帰に書き直してうまくいったけど、2つのリストをマージする関数に2,000,000要素くらいのリストを渡すとどうやってもstack overflowになってしまう。末尾再帰の書き方を変えてもダメ。なんなんだー!と思ってocamloptでネイティブコンパイルしてobjdumpして自分自身をcallしていないか探すが見つからず。ふとcamlList__appendに目が停まる。というのも、"OCaml 末尾再帰"でググったときに"...するとなんとかして末尾再帰なappendが書ける..."みたいな文章を目にしていたから。これはもしや、と思ってOCamlのマニュアル読んだら案の定appendは末尾再帰じゃなかった\(^O^)/結果返すときにappend使ってるから確実にstack overflowするようになってます本当に(ry

List.rev_append使ったら普通にStack overflowの問題解決。大きなデータのソーティングみたいなある種の極限状態では、組み込み関数を疑うことも重要ってことか。要はRead the F**king Manualということですね。