Вы можете написать тот же императивный код в Reason, что и в JS, и на самом деле он будет быстрее (на 30% на моем компьютере):
let findFloorImperative = code => {
let level = ref(0);
for (i in 0 to String.length(code) - 1) {
switch (code.[i]) {
| '(' => level := level^ + 1
| ')' => level := level^ - 1
| _ => failwith("invalid code")
}
};
level^
};
И это рекурсивное решение почти такое же быстрое:
let findFloorRecursiveNoList = code => {
let rec helper = (level, i) =>
if (i < String.length(code)) {
switch (code.[i]) {
| '(' => helper(level + 1, i + 1)
| ')' => helper(level - 1, i + 1)
| _ => failwith("invalid code")
}
} else {
level
};
helper(0, 0)
};
Результаты тестов:
Reason, imperative: 19,246,043 ops/sec
Reason, recursive, no list: 18,113,602 ops/sec
JavaScript, imperative: 13,761,780 ops/sec
Reason, recursive, list: 481,426 ops/sec
Reason, folding, list: 239,761 ops/sec
Источник: re: bench