function - 如何对没有显式返回类型的递归函数进行类型检查?
问题描述
我正在编写一种不输入函数的语言。这意味着我需要推断函数调用的返回类型才能进行类型检查。但是,当有人编写递归函数时,类型检查器会进入无限递归,试图推断函数体内的函数调用类型。
类型检查器执行以下操作:
- 推断函数调用实际参数的类型。
- 创建实际参数类型到形式参数的映射。
- 使用映射来注释函数体内使用的参数的类型。
- 推断并返回函数体的返回类型。
第 4 步尝试在函数体内推断函数调用的类型,它再次调用相同的类型检查器函数,导致无限递归。
给我这个问题的递归函数的一个例子:
function factorial(n) = n<1 ? 1 : n*factorial(n-1); // Function definition.
...
assert 24 == factorial(4); // Function call expression usage example.
如何在不进入无限递归循环的情况下解决这个问题?有没有办法推断递归函数调用的类型而不必再次进入正文?或者一些从上下文推断类型的干净方法?
我知道简单的解决方案可能是向函数添加类型注释,这样问题就很简单了,但在这样做之前,我想知道是否有办法解决这个问题而无需求助。
我也希望解决方案能够相互递归。
解决方案
推荐阅读
- c# - 如何使用视图从另一个 XAML 页面中包含的一个 XAML 页面传递数据
- bitbucket - 将源代码从 PVCS 迁移到 Bitbucket
- php - OSTicket 用户使用未添加到工单线程的电子邮件进行回复
- ios - 将多边形视图放在图像视图上以在目标 c 中进行裁剪
- git - 致命:模棱两可的参数'origin/feature/appjhagsd':未知的修订版或路径不在工作树中
- sql-server - SQL Query Group by Count 和 Left Join 表
- angular - 使用 tensorflowjs 项目运行 yarn watch 时出错
- sql-server - 如何从 Sage Evolution 数据库中获取付款百分比
- scala - cats.data.EitherT with traverse
- php - Oracle ROWID 值在超链接 uisng PHP 中不起作用