julialang : can (should) this type error be caught at compile time?

标签 julia typechecking

function somefun()
    x::Int = 1
    x = 0.5
end

这编译没有警告。当然调用它会产生 InexactError: Int64(0.5)。问题:您可以强制执行编译时检查吗?

最佳答案

从这个意义上说,Julia 是一种动态语言。所以,不,如果不先运行函数,您似乎无法检测到分配的结果是否会导致这样的错误,因为这种类型检查是在运行时完成的。

我自己也不确定,所以我把这个函数包装在一个模块中,在没有运行函数的情况下强制(预)编译,结果是没有抛出错误,这证实了这个想法。 (如果您想了解我的意思,请参阅 here)。

话虽如此,回答您问题的精神:有没有办法避免这种晦涩的运行时错误以意想不到的方式蔓延?

就在这里。考虑以下两个几乎等效的函数:

function fun1(x     ); y::Int = x; return y; end;
function fun2(x::Int); y::Int = x; return y; end;

fun1(0.5)   # ERROR: InexactError: Int64(0.5)
fun2(0.5)   # ERROR: MethodError: no method matching fun2(::Float64)

您可能会认为,重要的是,我们将一个错误换成了另一个错误。但这种情况并非如此。在第一种情况下,您不知道您的输入会导致问题,直到它在函数中使用。而在第二种情况下,您实际上是在调用函数时强制执行类型检查。

这是一个使用 Julia 优雅的类型检查系统的“按契约(Contract)”编程的简单示例。见 Design By Contract详情。

因此,您的问题的答案是,是的,如果您重新考虑您的设计并遵循良好的编程实践,以便及早发现此类错误,那么您可以避免稍后在难以修复的晦涩场景中发生它们或检测。

Julia 手册提供了 style guide这也可能有帮助(我上面给出的示例就在顶部!)。

关于julialang : can (should) this type error be caught at compile time?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56595644/

相关文章:

julia - 如何在 Julia 中智能地将一个参数应用于 Array{Function, 1} 元素?

julia - 参数类型创建

python - 是否可以将 Python 中的所有类型提示/检查基础结构分离到 .pyi 文件中?

typescript - 为什么 Typescript 允许我这样做?不检查数组的长度

arrays - Julia:矢量化代码与非矢量化代码

json - 当我从 txt 中读取时,Dict 的键没有得到认可 - Julia

macros - Julia 相当于一个 Lisp 符号宏?

javascript - 功能的冗余类型检查?

javascript - "JQuery Interface file"for Flow(来自 Facebook 的 JavaScript 静态类型检查器)?

c - 在 C 中是否有强制类型不兼容的好方法?