当前位置: 首页 > 知识库问答 >
问题:

为什么当我在另一个函数的应用中应用一个参数为n-1的函数(没有圆括号)时,会有无限的递归?

乜心思
2023-03-14

这里,我可以将参数7-1传递给函数f,不带圆括号。

Prelude> f = (+1)
Prelude> f 7-1
7

1.为什么下面是无限递归?

Prelude> addRec :: (Eq a, Num a) => a -> a; addRec 0 = 0; addRec n = n + addRec n-1;
Prelude> addRec 5

2.我可以通过在n-1添加括号来修复它

Prelude> addRec :: (Eq a, Num a) => a -> a; addRec 0 = 0; addRec n = n + addRec (n-1);
Prelude> addRec :: (Eq a, Num a) => a -> a; addRec 0 = 0; addRec n = n + (addRec $ n-1)

我们正在使用function application(据我所知,它是在函数后面用空格表示的运算符)来实现这种组合。

函数应用程序是左关联的,所以我的第一个问题是:当我们添加对应于默认左关联的括号时,addRec n=n+addRec n-1是什么样子的?

共有1个答案

戚京
2023-03-14

F7-1并不是您所想的那样。

在Haskell中,函数应用具有最高的优先级。这意味着F7-1总是被解释为(F7)-1。负号周围没有空格是无关紧要的,只有在巧合的情况下才得到正确答案:F7=(+1)7=8,然后8-1=7。如果函数定义为f=(*2)就不会发生这种情况。

类似地,addRec n-1被解释为(addRec n)-1,因此每次都使用相同的参数n调用addRec,从而产生无限的递归。

 类似资料:
  • 问题内容: 我想将传递给function()的所有参数作为参数传递给内部的另一个function(), 这可以在被调用过程中完成并将它们传递给,但是还有另一种方法吗? 本来 但是如果我的func1签名是 我如何将它们全部发送到func2,而不使用 有没有一种方法像在javascript中? 问题答案: 显式比隐式更好, 但是如果您真的不想键入一些字符,请执行以下操作: 都是局部变量,因此您不能在调

  • 我正在编写一个不和谐机器人,在私人服务器中使用,只是为了混日子。这是我第一次使用java。我正在使用不和谐JDA库来编码机器人。然而,我认为这不是主要问题。 对于如何从我创建的单独类中的特定方法中提取输出,我感到困惑。 我试图从一个名为Color.java的单独类中的公共String方法中拉出一个String到一个名为Commands.java.的文件中。 这是我的命令代码。JAVA这不是主文件,

  • 问题内容: 是否可以通过C语言函数API或通过使用其中将回调函数作为参数的参数在Postgres中创建用户定义的函数? 据我所知,没有办法通过C语言API来执行此操作,因为它仅接受sql数据类型,而没有的数据类型。但是也许我想念什么? 问题答案: 我认为您不能,但是由于没有匿名函数,因此应该传递函数名。

  • null 我可以推断,在Java中,这种类型的方法可以应用于带有一个参数的函数接口。 还有,有没有一个参数函数接口的例子,函数有一个参数,不像上面的例子?

  • 我不明白为什么下面的代码会打印两次。我以为应该是个人和学生。当通过“a”对象调用printPerson()内部的getInfo()时,为什么要调用Person类内部的一个,为什么不调用Student类中的一个?提前谢谢。

  • 我试图在Kotlin中使用公共接口函数(正如我在Java中学习的那样)。 为此我创建了我的方法 据我记忆所及,我应该能做 但这似乎是不可能的(尽管可以使用modifier1.apply{input}) 阅读更多关于它的信息,我发现: Kotlin:如何将一个函数作为参数传递给另一个? 所以我把我的方法签名改为: 在这里我可以做 我可以这样叫福 哪里 到目前为止,这似乎是可能的,但将函数引用设为nu