web-dev-qa-db-ja.com

Julia-0.6の関数定義の `where`

リリースノート を読んで、Juliav0.6の新しい型システムを理解しようとしています。

誰か教えてもらえますか

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

クラシックを使用するのとは異なる点を教えてくれます

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

26

新しい構文は同じことを意味しますが、より多くの状況で使用でき、より多くの構成を表現でき、特に周囲のパラメトリックコンストラクターを取り巻く多くの概念のあいまいさを排除します。古い構文は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

特に、これらのいずれにも構文はありません。

  • 現在のスコープのTの具体的な値のメソッドをF{T}に追加します。

  • パラメトリック値TごとにF{T}にメソッドを追加します。

この状況により、Julia 0.5以前のコンストラクター構文は、必要以上に混乱し、直感的ではなくなります。 Julia 1.0では、型パラメーターとコンストラクターは、次の原則に従って、より直感的で一貫性のあるものになります。

  • メソッドの定義に使用される構文は、メソッドの呼び出しに使用される構文と常に一致します。
  • F{T}構文は、常にタイプFとパラメーターTを参照します。
  • 型パラメーターは常にwhere句によって導入されます。

0.6がリリースされたときの変更について、おそらく0.6リリースのハイライトに関するブログ投稿で、より詳細な説明があります。

23
StefanKarpinski