gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 20:28:00 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com