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

Mic*_*ard 25 julia

我试图在阅读发行说明的基础上理解Julia v0.6中的新类型系统.

任何人都可以告诉我什么

inv(M::Matrix{T}) where T <: AbstractFloat
Run Code Online (Sandbox Code Playgroud)

给了我与使用经典不同的东西

inv{T<:AbstractFloat}(M::Matrix{T})
Run Code Online (Sandbox Code Playgroud)

Ste*_*ski 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一个函数的方法,类型参数是T形式参数args...和定义expr.

特别是,这些都没有语法:

  • F{T}T当前范围中的具体值添加方法.

  • F{T}为每个参数值添加方法T.

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

  • 用于定义方法的语法始终与用于调用它的语法相匹配.
  • F{T}语法总是指类型F与参数T.
  • 类型参数始终由where子句引入.

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

  • 在我读到这篇文章之前,我并不完全清楚为什么语法也在改变,但是通过这个解释,我突然对它很满意! (4认同)
  • 非常感谢您的详细回复,这已经非常有用了.如果我理解正确,这意味着旧语法被更新,更清晰的语法所取代?我认为这看起来像一个非常好的语法更改. (3认同)
  • 关于语法的可读性已经存在一些持续的争论,并且它还没有一成不变,所以我们将看到最终的0.6版本中会发生什么.我可能要来编辑这个问题和答案:) (3认同)