julia-0.6中函数定义中的`where`

时间:2017-01-30 08:08:21

标签: julia

我试图在阅读release notes的基础上理解Julia v0.6中的新类型系统。

谁能告诉我什么

inv(M::Matrix{T}) where T <: AbstractFloat

给了我与使用经典

不同的东西
inv{T<:AbstractFloat}(M::Matrix{T})

1 个答案:

答案 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}的具体值。

  • 为每个参数值TF{T}添加方法。

这种情况会导致Julia 0.5中的构造函数语法,并且之前会比必要的更令人困惑和不直观。在Julia 1.0中,类型参数和构造函数将更加直观和一致,遵循以下原则:

  • 用于定义方法的语法始终与用于调用它的语法相匹配。
  • T语法始终引用带参数F{T}的{​​{1}}类型。
  • 类型参数始终由F子句引入。

当0.6出现时,会有更详细的变化解释,可能是在博客文章中关于0.6版本的亮点。