julialang:可以(应该)在编译时捕获这种类型错误吗?

2023-12-28

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

编译时没有任何警告。当然,调用它会产生 InexactError:Int64(0.5)。问题:你能强制执行编译时检查吗?


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

我自己也不确定,所以我把这个函数包装在一个模块中,在没有运行该函数的情况下强制(预)编译,结果是没有抛出任何错误,这证实了这个想法。 (看here https://stackoverflow.com/a/50627721/4183191如果你想明白我的意思)。

说了这么多,来回答一下spirit你的问题:有没有办法避免这种晦涩的运行时错误以意想不到的方式蔓延?

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

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)

您可能会想,这有什么大不了的,我们用一个错误换成了另一个错误。但这种情况并非如此。在第一种情况下,您不知道您的输入会导致问题,直到在函数中使用它为止。而在第二种情况下,您实际上是在以下位置强制执行类型检查:calling功能。

这是利用 Julia 优雅的类型检查系统“按契约”编程的一个简单示例。看按合同设计 https://en.wikipedia.org/wiki/Design_by_contract了解详情。

所以你的问题的答案是,是的,如果你重新考虑你的设计并遵循良好的编程实践,这样就能尽早发现这种错误,那么你就可以避免它们稍后在难以修复的模糊场景中发生或检测。

Julia 手册提供了时尚指南 https://docs.julialang.org/en/v1/manual/style-guide/index.html这也可能有帮助(我上面给出的例子就在顶部!)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

julialang:可以(应该)在编译时捕获这种类型错误吗? 的相关文章

  • Julia 作用域:为什么这个函数会修改全局变量?

    我是 Julia 的新手 但到目前为止我还是它的粉丝 但根据多年的 R 编程经验 一些范围规则让我感到困惑 我们来看看这个函数 这与我的预期完全一致 function foo1 x y x t 1 while t lt 1000 t 1 y
  • Julia 中的内存分配

    将程序从 Python 翻译成 Julia 后 我非常不满意 对于小 非常小的输入 Python 更快 对于中等输入 Julia 更快 但没那么快 对于大输入 Python 更快 我认为原因是我不明白内存分配是如何工作的 这里自学者 没有C
  • AGDA 中极浅嵌入 VHDL 的指南

    对于我的编程语言项目 我正在 agda 中做一个非常浅且简单的 VHDL 数字电路嵌入 目的是写出语法 静态语义 动态语义 然后写一些证明来展示我们对材料的理解 到目前为止我已经编写了以下代码 data Ckt Set where var
  • 如何在 Julia 1.0 中离线安装 julia 包?

    我有自己的 Julia 包 在 Julia 0 6 上运行良好 当我尝试升级到 Julia 1 0 时 我发现在 Julia 1 0 中添加我自己的包更加困难 我不能把它放在 pkg dir 下 在我的情况下 该包只是我本地磁盘上的几个文件
  • 如何加快 Julia 脚本的启动时间

    我编写了一个脚本来在 Julia 中绘制每日数据 但我发现它运行缓慢 似乎没有理想的方法来加速它 例如 foo jl bin bash exec julia O0 compile min BASH SOURCE 0 using Unicod
  • Julia 泛型函数类型参数

    我定义了一个函数如下 function approx pi n tot Float64 0 0 for i in 1 n x rand y rand if x 2 y 2 lt 1 tot 1 end end tot n 4 end pri
  • Julia DataFrames 中的高效自定义排序?

    有没有一种快速的方法来指定自定义订单sort sort 在 Julia 数据框架上 julia gt using DataFrames julia gt srand 1 julia gt df DataFrame x rand 10 y r
  • 如何在 Julia 中提供可重现的样本数据

    Here on stackoverflow com 当我提供样本数据来制作可重现的示例时 我该如何以朱利安方式做到这一点 In R例如dput df 将输出一个字符串 您可以用它来创建df再次 因此 您只需将结果发布到 stackoverf
  • 如何创建并推送到共享或分布式数组数组?

    我编写了 Julia 代码 其中初始化一个空数组 如下所示 a 稍后在代码中 我简单地推送到该数组 如下所示 推 a b 其中 b c d e 是另一个数组 每个 b 可以具有不同的长度 这在非并行化代码中工作得很好 但是 我想在并行代码中
  • Julia:显示函数体(以查找丢失的代码)

    在 R 语言中 我可以声明一个函数并查看函数体 如下所示 gt megafoobar function x return x 10000 gt body megafoobar return x 10000 类似的事情在 Julia 中也可能
  • 有没有办法在 writetable() 中使用字符串作为分隔符 - Julia

    当使用 writetable 将数据帧写入文件时 我希望能够将分隔符设为空格然后逗号 即 作为分隔符 我知道 writetable 只能选择将单个字符作为分隔符参数 是否有可能的解决方法能够将字符串作为分隔符 或者 是否可以简单地在数据框中
  • 在 Julia 中,有没有办法让“现在”(至少)达到毫秒精度?

    通常 要了解代码中发生的情况 您需要高精度时间来分析您的应用程序或出于其他原因 显然 现在 https stackoverflow com questions 32407509 how to get the milliseconds fro
  • 在 Julia 中提取参数类型

    假设我在 Julia 中编写了一个函数 它接受Dict K V 作为参数 然后创建类型的数组Array K 1 and Array V 1 我怎样才能提取类型K and V来自 Dict 对象 以便我可以使用它们来创建数组 斯文和约翰的答案
  • 带有 return 语句的 Julia @parallel for 循环

    如何在满足条件时立即返回所有工作人员的函数中编写并行 for 循环 IE 像这样的东西 function test n sync parallel for i in 1 1000 statement if condition return
  • Julia:如何使用 PyPlot 创建不同大小的子图?

    我想创建一个包含多个绘图的图形 不过我希望能够使每个图具有不同的大小 例如 我希望第一个子图的宽度大约是第二个子图的两倍 我希望做这样的事情 using PyPlot a rand 500 900 b rand 500 400 notice
  • 朱莉娅在矩阵中查找(行,列)而不是索引

    在 Julia 中 您可以通过以下方式找到矩阵中元素的坐标 julia gt find x gt x 2 1 2 3 2 3 4 1 0 2 3 element Array Int64 1 2 4 9 这些值是正确的 但我更希望得到 row
  • Julia Threads.@threads 比单线程性能慢

    我正在尝试求解一维热方程的数值 我正在使用有限差分 并且在 Julia 中使用 threads 指令时遇到一些问题 特别是下面有相同代码的两个版本 第一个是单线程 而另一个使用 threads 除了 thread指令之外 它们是相同的 fu
  • 使用 Pkg.add 时出现 julia 错误

    我刚刚在ubuntu中安装了julia 在添加包时发现了一些问题 julia gt Pkg Add Gadfly ERROR UndefVarError Add not defined 我也尝试更新 julia 但弹出错误 julia gt
  • 是否可以从 Julia 调用 Python 函数并返回其结果?

    我正在使用 Python 从网络上抓取数据 我想使用这些数据在 Julia 中运行计算 是否可以在 Julia 中调用该函数并返回其结果 或者我最好直接导出到 CSV 并以这种方式加载数据 绝对地 看PyCall jl https gith
  • 如何终止 Julia 中的任务/协程?

    using HttpServer http HttpHandler do request Request response Response show request Response Hello there end http events

随机推荐