【问题标题】:`where` in function definitions in julia-0.6julia-0.6 函数定义中的`where`
【发布时间】:2017-01-30 08:08:21
【问题描述】:

我正在尝试了解 Julia v0.6 中的新类型系统,基于阅读 release notes

谁能告诉我

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

给了我与使用经典不同的地方

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

?

【问题讨论】:

  • 我不知道你的问题的答案,但我很好奇新语法是取代旧语法,还是增加。

标签: julia


【解决方案1】:

新语法的含义相同,但可以在更多情况下使用,可以表达更多构造并消除许多概念上的歧义,尤其是围绕参数构造函数。旧语法将在 0.6 中弃用,一些旧语法将在 1.0 中以不同的含义回收。从根本上说,F{T}(args...) 的问题在于,F{T} 部分在概念上是模棱两可的——解析器知道它的含义,但它常常让人类感到困惑:

  • 孤立地F{T}表示参数类型F和类型参数T

  • 后跟括号,不作为方法定义的一部分,F{T}(args...) 表示将类型 F{T} 作为函数应用到参数 args...,通常构造 F{T} 类型的实例。

  • 后跟parens和equals,即作为F{T}(args...) = expr中方法定义的一部分,这意味着将F的方法定义为函数,类型参数T形式参数args...和定义expr

特别是,其中任何一个都没有语法:

  • F{T} 中添加一个方法来获取当前范围内T 的具体值。

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

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

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

当 0.6 发布时,将会有更详细的更改解释,可能在一篇关于 0.6 版本亮点的博客文章中。

【讨论】:

  • 非常感谢您的详细回复,这已经非常有用了。如果我理解正确,这意味着旧语法被更新、更清晰的语法所取代?我认为这看起来是一个非常好的语法更改。
  • 我看到过一些像f(x::T) where T = x 这样的例子。这是推荐的用法吗?是否对其可读性或清晰度有任何顾虑?
  • 关于该语法的可读性一直存在一些争论,而且还没有确定下来,所以我们将看看最终的 0.6 版本会发生什么。我可能不得不来编辑这个问题和答案:)
  • 直到我读到这篇文章,我也不完全清楚为什么语法会发生变化,但是有了这个解释,我突然对它感到非常满意!
  • 没有博文,但这里是这篇博文的更新版本(有一些关于新语法和功能的讨论):discourse.julialang.org/t/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-19
  • 2019-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
相关资源
最近更新 更多