リリースノート を読んで、Juliav0.6の新しい型システムを理解しようとしています。
誰か教えてもらえますか
inv(M::Matrix{T}) where T <: AbstractFloat
クラシックを使用するのとは異なる点を教えてくれます
inv{T<:AbstractFloat}(M::Matrix{T})
?
新しい構文は同じことを意味しますが、より多くの状況で使用でき、より多くの構成を表現でき、特に周囲のパラメトリックコンストラクターを取り巻く多くの概念のあいまいさを排除します。古い構文は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リリースのハイライトに関するブログ投稿で、より詳細な説明があります。