'Too much recursion'-打字稿错误
'Too much recursion'-error in Typescript
我正在尝试结合一些练习来学习 Typescript。我不明白为什么我会收到太多递归的错误。我做了一些包装函数。
包装函数
type Fun<a,b> = {
f: (i:a) => b
then: <c>(g:Fun<b,c>) => Fun<a,c>
}
let myFunction = function<a,b>(f:(_:a) => b) : Fun<a,b> {
return {
f:f,
then: function<c>(this:Fun<a,b>, g:Fun<b,c>) : Fun<a,c> {
return then(this,g);
}
}
};
let then = function<a,b,c>(f: Fun<a,b>, g:Fun<b,c>) : Fun<a,c> {
return myFunction(a => g.f(f.f(a)))
};
可以这么说,我想创建自己的 RepeatFunction,而我可以传递一个函数和一定数量的执行作为参数。
我的代码
let increase = myFunction<number,number>(x => x + 1);
let RepeatFunction = function<a>(f: Fun<a,a>, n: number) : Fun<a,a> {
if (n < 0)
{
return myFunction(x => f.f(x));
}
else
{
for (let i = 0; i < n; i++)
{
RepeatFunction(myFunction<a,a>(x => this.f(x)), n); //error in console
}
}
};
console.log(RepeatFunction(increase, 2).f(10));
我想调用 RepeatFunction,传入我的增加函数以在数字 10 上执行 2 次。
我收到错误:'Too much recursion'。谁能告诉我我在这里缺少什么?没有语法错误。
编辑 2
let RepeatFunction = function<a>(f: Fun<a,a>, n: number) : Fun<a,a> {
if (n < 0)
{
return myFunction(x => f.f(x));
}
else
{
return RepeatFunction(myFunction<a,a>(x => f.f(x)), n - 1);
}
};
console.log(RepeatFunction(incr, 1).f(10)); // answer is: 11
console.log(RepeatFunction(incr, 5).f(10)); // answer is: 11
console.log(RepeatFunction(incr, 50).f(10)); // answer is: 11
问题是这是无限递归的,因为 n
的值永远不会改变,你总是用相同的 n
调用 RepeatFunction
。我的猜测是你想调用它 n
次,所以你应该在下次调用它时减少 n
次,或者你可以使用迭代版本:
let RepeatFunction = function<a>(f: Fun<a,a>, n: number) : Fun<a,a> {
if (n < 1)
{
return myFunction(x => f.f(x));
}
else
{
var fn = myFunction<a,a>((x) => f.f(x));
for (var i = 0; i < n; i++) {
fn = fn.then(f);
}
return fn;
}
};
我正在尝试结合一些练习来学习 Typescript。我不明白为什么我会收到太多递归的错误。我做了一些包装函数。
包装函数
type Fun<a,b> = {
f: (i:a) => b
then: <c>(g:Fun<b,c>) => Fun<a,c>
}
let myFunction = function<a,b>(f:(_:a) => b) : Fun<a,b> {
return {
f:f,
then: function<c>(this:Fun<a,b>, g:Fun<b,c>) : Fun<a,c> {
return then(this,g);
}
}
};
let then = function<a,b,c>(f: Fun<a,b>, g:Fun<b,c>) : Fun<a,c> {
return myFunction(a => g.f(f.f(a)))
};
可以这么说,我想创建自己的 RepeatFunction,而我可以传递一个函数和一定数量的执行作为参数。
我的代码
let increase = myFunction<number,number>(x => x + 1);
let RepeatFunction = function<a>(f: Fun<a,a>, n: number) : Fun<a,a> {
if (n < 0)
{
return myFunction(x => f.f(x));
}
else
{
for (let i = 0; i < n; i++)
{
RepeatFunction(myFunction<a,a>(x => this.f(x)), n); //error in console
}
}
};
console.log(RepeatFunction(increase, 2).f(10));
我想调用 RepeatFunction,传入我的增加函数以在数字 10 上执行 2 次。
我收到错误:'Too much recursion'。谁能告诉我我在这里缺少什么?没有语法错误。
编辑 2
let RepeatFunction = function<a>(f: Fun<a,a>, n: number) : Fun<a,a> {
if (n < 0)
{
return myFunction(x => f.f(x));
}
else
{
return RepeatFunction(myFunction<a,a>(x => f.f(x)), n - 1);
}
};
console.log(RepeatFunction(incr, 1).f(10)); // answer is: 11
console.log(RepeatFunction(incr, 5).f(10)); // answer is: 11
console.log(RepeatFunction(incr, 50).f(10)); // answer is: 11
问题是这是无限递归的,因为 n
的值永远不会改变,你总是用相同的 n
调用 RepeatFunction
。我的猜测是你想调用它 n
次,所以你应该在下次调用它时减少 n
次,或者你可以使用迭代版本:
let RepeatFunction = function<a>(f: Fun<a,a>, n: number) : Fun<a,a> {
if (n < 1)
{
return myFunction(x => f.f(x));
}
else
{
var fn = myFunction<a,a>((x) => f.f(x));
for (var i = 0; i < n; i++) {
fn = fn.then(f);
}
return fn;
}
};