【发布时间】:2020-12-08 13:45:23
【问题描述】:
目前(截至 2020 年 8 月)Rakudo 不在编译时对函数的返回值进行类型检查;也就是说,它不提供函数满足其返回约束的静态保证。具体来说,以下两个函数都编译为 Raku:
sub get-int(--> Int) { 'bug' }
sub get-int($a --> Int) {
when $a == 5 { 'Rare bug' }
default { 42 }
}
我有两个相关的问题:
-
有什么方法可以知道当前在编译时发生了什么(如果有的话)类型检查? (通过某人编写的列表、文档中的某处或 Rakudo 源中的中心位置)还是比这更临时?
-
缺乏编译时类型检查是否是有意的设计决策?或者是添加更多静态类型检查的东西,有一天会很高兴,但还没有实现?
(我熟悉 Johnathan 对 The performance penalties for types/constraints in Raku? 的出色回答,其中指出“Raku 要求写入程序的类型约束在运行时最迟强制执行。”该回答描述了多种方式以避免类型检查的运行时成本,但没有描述在编译时进行的类型检查(如果有的话)(这肯定会避免运行时成本!)。)
【问题讨论】:
-
❶ 在编译时强制执行
6.d的返回类型语义将提供比预期更少的价值,因为它有一个隐式|Nil。 ❷ 大多数人不知道这一点。 ❸ jnthn 勾勒出未来。未来可能允许(相当于)省略|Nil并根据 explicit 约束执行或警告。 ❹ Raku 的类型是 名义上的,类似于结构 quasi-static typing 及其“错误类型”和“矛盾”类型的类别。 Rakudo,或检查模块,可以越来越多地警告或(r)相对于这两个类别。 -
我认为2005 comment by Audrey Tang about possible type inference 涵盖的领域与今天的 Raku(do) 所涵盖的领域非常相似,因此它是一本有用的读物。关于 Raku(do) 类型检查器由于“类型错误”的程序而能够在编译时拒绝程序,请关注她的
Error类别。 Aiui,在我们今天拥有的 Raku 中,课程永远不会“关闭”或“最终确定”。如果引入这些,Rakudo 可能必须强制执行并了解整个程序的打开/关闭/最终状态。 -
@raiph 就问题中的示例而言,
Nil没有涉及;可以有效地检测到从声明为Int的东西返回的Str。您所说的与在调用现场处理返回值有关。 -
@raiph 就类而言:通常我们倾向于说程序的词法元素是针对静态分析的,而方法调用是发生后期绑定的地方,因此不受此限制。在类型检查模块(或做出封闭世界假设的 IDE)中,以进行更多检查的名义假设方法调用没有这么晚是可能的,但我认为这并不适合标准语言。跨度>
-
@JonathanWorthington 感谢您的回复。你所说的对我来说很有意义,而且对于 Raku、Rakudo、Comma 和分析插件/模块来说听起来很棒。谢谢你的聪明。 :)
标签: raku typechecking rakudo