我试图在阅读release notes的基础上理解Julia v0.6中的新类型系统。
谁能告诉我什么
inv(M::Matrix{T}) where T <: AbstractFloat
给了我与使用经典
不同的东西inv{T<:AbstractFloat}(M::Matrix{T})
答案 0 :(得分:23)
新语法意味着相同的东西,但可以在更多情况下使用,并且可以表达更多结构并消除许多概念上的歧义,尤其是围绕参数构造函数。旧语法将在0.6中弃用,并且一些旧语法将在1.0中以不同含义回收。从根本上说,F{T}(args...)
的问题是F{T}
部分在概念上是模棱两可的 - 解析器知道它的含义,但它常常让人感到困惑:
孤立地F{T}
表示参数类型F
,其类型参数为T
。
后跟parens,而不是方法定义的一部分,F{T}(args...)
表示将类型F{T}
作为函数应用于参数args...
,通常构造一个实例类型F{T}
。
后跟parens和equals,即作为F{T}(args...) = expr
中方法定义的一部分,它意味着将F
的方法定义为函数,类型参数为{{1} }形式参数T
和定义args...
。
特别是,这两种方法都没有语法:
向expr
方法添加方法,以获取当前范围内F{T}
的具体值。
为每个参数值T
向F{T}
添加方法。
这种情况会导致Julia 0.5中的构造函数语法,并且之前会比必要的更令人困惑和不直观。在Julia 1.0中,类型参数和构造函数将更加直观和一致,遵循以下原则:
T
语法始终引用带参数F{T}
的{{1}}类型。F
子句引入。当0.6出现时,会有更详细的变化解释,可能是在博客文章中关于0.6版本的亮点。