On Friday, January 20, 2017 at 11:17:32 AM UTC-7, mrbackend (Roy Brokvam)
wrote:
>
> Consider:
> type Nat
> = Zero
> | Succ Nat
>
>
> nat : Int -> Nat
> nat n =
> nat_ n Zero
>
>
> nat_ : Int -> Nat -> Nat
> nat_ n curr =
> if n <= 0 then
> curr
> else
> nat_ (n - 1) (Succ curr)
>
> Using tail recursion, this should be stack safe in Elm (as far as I
> understand). But I get a stack overflow for large values of n (>= 5000). Is
> my function really tail recursive, or might there be a bug in Elm?
>
It compiles into this:
```elm
var _user$project$Temp1484937158714761$Succ = function (a) {
return {ctor: 'Succ', _0: a};
};
var _user$project$Temp1484937158714761$nat_ = F2(
function (n, curr) {
nat_:
while (true) {
if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) {
return curr;
} else {
var _v0 = n - 1,
_v1 = _user$project$Temp1484937158714761$Succ(curr);
n = _v0;
curr = _v1;
continue nat_;
}
}
});
var _user$project$Temp1484937158714761$Zero = {ctor: 'Zero'};
var _user$project$Temp1484937158714761$nat = function (n) {
return A2(_user$project$Temp1484937158714761$nat_, n,
_user$project$Temp1484937158714761$Zero);
};
```
So it does look TCO'd, what is the exact stack trace that you got?
--
You received this message because you are subscribed to the Google Groups "Elm
Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.