現象
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
には気をつけよう
という話でした。