如何让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自动检测作业中的不兼容类型

例如,当我写作的时候

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))))