如何让Julia在赋值时检测不兼容的类型?
很抱歉问了一个基本问题,谷歌搜索到目前为止还没有太大用处 我是个新手。我想问一下,是否有可能让Julia自动检测作业中的不兼容类型 例如,当我写作的时候如何让Julia在赋值时检测不兼容的类型?,julia,Julia,很抱歉问了一个基本问题,谷歌搜索到目前为止还没有太大用处 我是个新手。我想问一下,是否有可能让Julia自动检测作业中的不兼容类型 例如,当我写作的时候 julia> x=10; julia> typeof(x) Int32 julia> y=9.0; julia> typeof(y) Float64 julia> x=y // I'd like this to generate an error or a warning at least 9.0 j
julia> x=10;
julia> typeof(x)
Int32
julia> y=9.0;
julia> typeof(y)
Float64
julia> x=y // I'd like this to generate an error or a warning at least
9.0
julia> typeof(x) // do not want automatic type conversion
Float64
我发现如果把作业改成
julia> (x=y)::Int32
ERROR: type: typeassert: expected Int32, got Float64
但我不想一直写这篇文章,我希望朱莉娅能够自动检测到这一点。
我试图做下面这样的声明,但我似乎做错了什么
julia> x::Int32=10;
julia> y::Float64=9.0
ERROR: type: typeassert: expected Float64, got Int32
例如,在Java中,这会生成编译错误:
public class App{
public static void main (String[] args) {
int x=10;
double y=9.0;
x=y;
}
}
error: incompatible types: possible lossy conversion from double to int x=y;
我需要改变什么才能实现这一点?我是否需要先用正确的类型声明x,y?怎样?我在Linux上使用的是Julia 0.3。变量表示的值可以限定为始终具有特定类型,并且将检查不兼容的值,但在运行时会检查此冲突。从: 当附加到语句上下文中的变量时,::运算符的含义有点不同:它声明变量始终具有指定的类型,就像C等静态类型语言中的类型声明一样。分配给变量的每个值都将使用convert函数转换为声明的类型 不过,这里有一个重要的警告 目前,类型声明不能在全局范围内使用,例如在REPL中,因为Julia还没有常量类型全局变量 所以你的实验不起作用,因为你用的是globals。但是,使用函数中限定范围的变量的类型断言不会 以你为例 案例一 这看起来好像发生了错误的事情,但函数的结果是最后一个计算的表达式。因此,在案例I中,赋值表达式返回一个Float64值,尽管x仍然隐式赋值为9.0,并转换为Int64或9。但在案例II中,最后一个表达式只是x,即Int64 案例二 当y接受一个对Int64没有损失的值时,抛出一个错误 案例三 勇气 您可以使用函数对键入的代码进行更精确的查看。考虑以下事项:
julia> f(y::Float64)=(x::Int64=y)
f (generic function with 1 method)
julia> code_typed(f,(Float64,))
1-element Array{Any,1}:
:($(Expr(:lambda, {:y}, {{:x},{{:y,Float64,0},{:x,Int64,18}},{}}, :(begin # none, line 1:
x = top(typeassert)(top(box)(Int64,top(checked_fptosi)(Int64,y::Float64))::Int64,Int64)::Int64
return y::Float64
end::Float64))))
julia> f(y::Float64)=(x::Int64=y;x)
f (generic function with 1 method)
julia> code_typed(f,(Float64,))
1-element Array{Any,1}:
:($(Expr(:lambda, {:y}, {{:x},{{:y,Float64,0},{:x,Int64,18}},{}}, :(begin # none, line 1:
x = top(typeassert)(top(box)(Int64,top(checked_fptosi)(Int64,y::Float64))::Int64,Int64)::Int64
return x::Int64
end::Int64))))
有关更多详细信息,请参阅“用类型系统的行话描述Julia,它是:动态的、命名的和参数化的。”谢谢。但是我不理解这种差异
main()=(x::Int64=10;y::Float64=9.0;x=y);typeof(main())
返回Float64
,而main()=(x::Int64=10;y::Float64=9.0;x=y;x);typeof(main())
现在返回Int64
?不应该先计算x=y
,然后从main()返回表达式的结果,即x
?那么为什么它会给出与写入x=y不同的结果;x
?如果你认为这应该是一个单独的问题,我可以发布它。我还认为你上面展示的第二个案例应该返回一个错误。我看不出y::Float64=9.9
和y::Float64=9.0
在打字方面有什么区别。这两种类型都与x
type不兼容,那么它应该在这两种情况下都给出此错误。这就是我希望Julia所做的。@Nasser Julia不会仅仅因为类型差异而阻止变量赋值。我补充了一些解释。希望有帮助。
julia> main()=(x::Int64=10;y::Float64=9.0;x=y;x)
main (generic function with 1 method)
julia> main()
9
julia> typeof(main())
Int64
julia> main()=(x::Int64=10;y::Float64=9.9;x=y;x)
main (generic function with 1 method)
julia> main()
ERROR: InexactError()
in main at none:1
julia> f(y::Float64)=(x::Int64=y)
f (generic function with 1 method)
julia> code_typed(f,(Float64,))
1-element Array{Any,1}:
:($(Expr(:lambda, {:y}, {{:x},{{:y,Float64,0},{:x,Int64,18}},{}}, :(begin # none, line 1:
x = top(typeassert)(top(box)(Int64,top(checked_fptosi)(Int64,y::Float64))::Int64,Int64)::Int64
return y::Float64
end::Float64))))
julia> f(y::Float64)=(x::Int64=y;x)
f (generic function with 1 method)
julia> code_typed(f,(Float64,))
1-element Array{Any,1}:
:($(Expr(:lambda, {:y}, {{:x},{{:y,Float64,0},{:x,Int64,18}},{}}, :(begin # none, line 1:
x = top(typeassert)(top(box)(Int64,top(checked_fptosi)(Int64,y::Float64))::Int64,Int64)::Int64
return x::Int64
end::Int64))))