現象
ReasonMLにて、List.mapの使用中に
Maximum call stack size exceeded
が発生しました。
再帰呼び出しでおなじみのエラーです。
原因
僕が書いていたコードに、無限再帰が発生するようなコードが無かったため、
List.mapの中身を疑ったところ、内部で再帰呼び出しをしていました。
ちなみにこちらが、List.mapの中身です。
function map(f, param) {
if (param) {
var r = Curry._1(f, param[0]);
return /* :: */[
r,
map(f, param[1])
];
} else {
return /* [] */0;
}
}
明らかに、f()が再帰になっています。
つまり、大量の要素数のListを扱う場面では、エラーが発生します。
解決
Arrayを使うしかないと思われます。
ArrayはJavaScriptの配列なので、問題なく利用できます。
forもつかえますが、Listだとインデックスによるランダムアクセスが遅いので、使わない方が良いです。
おわり
ということで、
ReasonMLの
Listには気をつけよう
という話でした。