0

I made this factorial solver but all it outputs is:

  We've found a bug for you!
  6| let factorialNumber = 0;
  7| Js.log(factorial(factorialNumber));
(error here)8|  factorialNumber = factorialNumber + 1;
  9|}
The value factorialNumber is not an instance variable

The code

let rec factorial = (n) =>
  n <= 0
  ? 1
  : n * factorial(n - 1);
while (true){
  factorialNumber = 0
  Js.log(factorial(factorialNumber));
  factorialNumber = factorialNumber + 1
}
glennsl
  • 28,186
  • 12
  • 57
  • 75
JonDoeBeep
  • 41
  • 6
  • Your `factorialNumber` is an implicit global. You should declare it as `let factorialNumber = 0` – VLAZ Oct 12 '20 at 21:11

1 Answers1

0

In Reason, variables are immutable by default. You're also not declaring factorialNumber as a variable anywhere.

The changes needed to make this compile is:

  1. Declare the variable using let
  2. Make the variable a mutable reference using ref
  3. Access the value of the reference using ^
  4. Assign a new value to the reference using :=
while (true) {
  let factorialNumber = ref(0);
  Js.log(factorial(factorialNumber^));
  factorialNumber := factorialNumber^ + 1
}

This still doesn't make much sense, however, as you're still just running factorial(0) on every iteration. I suspect what you want is to move the declaration and initial assignment outside the loop, so that it's incremented by one on each iteration:

let factorialNumber = ref(0);

while (true) {
  Js.log(factorial(factorialNumber^));
  factorialNumber := factorialNumber^ + 1
}
glennsl
  • 28,186
  • 12
  • 57
  • 75
  • Also, there is a built-in function `incr` which adds `1` to an `int` reference: `incr(factorialNumber);` instead of `factorialNumber := factorialNumber^ + 1;` – Yawar Oct 13 '20 at 18:28