Rust: 🔬ゞェネリック関連タむプGATの远跡の問題

䜜成日 2017幎09月02日  Â·  67コメント  Â·  ゜ヌス: rust-lang/rust

A-associated-items A-traits A-typesystem B-RFC-approved B-unstable C-tracking-issue E-mentor F-generic_associated_types T-compiler T-lang WG-compiler-traits requires-nightly

最も参考になるコメント

https://github.com/rust-lang/rust/issues/44265#issuecomment -568247656はやや簡朔な曎新です。

67510は、実装が必芁な最埌の䞻芁なICE/欠萜機胜です。

党おのコメント67件

これが私が垞に最新の状態に保぀ように努力する䞀皮の実斜蚈画です。

  • []ステップ1ASTにサポヌトを远加しおきれいに印刷する

    • おそらく最初のステップは、新しいフォヌムの解析を開始し、それらのサポヌトをASTに远加するこずです。

    • ここでより詳现な考えに぀いおは、このコメントを参照しおください。

    • いく぀かの解析のみのテストを蚘述し、プリティプリンタヌのhirもテストできるはずです。

    • HIRの䜎䞋に到達するず、GATが存圚する堎合ぱラヌになる可胜性がありたす

    • フィヌチャヌゲヌトを行うこずもできたす

  • []もっず来る

たず、ASTに぀いお詳しく説明したす。 たず、今日それがどのように機胜するかに぀いお説明したしょう

トレむト定矩のtype Foo: Bar [= Baz];アむテムは、このASTバリアントによっお定矩されたす。 これには、境界 Bar ずオプションのデフォルト倀Bazが含たれたす。 名前はTraitItem構造䜓で定矩されおいたす。

トレむトimplのtype Foo = Bar;アむテムは、このASTバリアントによっお定矩されたす。 FooなどがImplItemで定矩されおいるため、タむプBarのみが含たれたす。 ImplItem struct 。

メ゜ッドはすでに汎甚化できるため、興味深いケヌスです。 これらのゞェネリックパラメヌタヌは、 MethodSig構造䜓のフィヌルドGenericsで宣蚀されおいたす。 これはGenerics構造䜓のむンスタンスです。

私の考えでは、 Genericsをメ゜ッドからTraitItem およびImplItem に「リフト」しお、すべおの圢匏に等しく適甚されるようにするのが最善の方法です。特性ずimplアむテム。 今のずころ、䞀般的な定数はサポヌトしないず思いたすが、正盎なずころ、いずれにせよ、それらはおそらく私たちが行っおいる䜜業から倖れるだけなので、小さな拡匵になりたす。 今蚈画を立おれば、仕事はもっずうたくいくず思いたす。

おそらく、たずもな最初のPRは、他のすべおの既存の機胜を同じに保ちながら、その倉曎を行うこずです。 ぀たり、 GenericsをTraitItem およびImplItem に远加し、$$ MethodSigから远加したす。 非メ゜ッドには空のGenericsを提䟛したす。 既存のコヌドを凊理し、必芁に応じおゞェネリックを配管しお機胜させたす。

@nikomatsakisかっこいい どうもありがずう 私は昚倜実隓を始めたしたが、ASTに぀いおのコメントであなたが指摘したのず同じ堎所を芋぀けたこずを誇りに思いたす。 smilerustcは初めおだったので、それを成果ずしお数えたす

ゞェネリックをTraitItemに匕き䞊げるずは思いたせんでした。 私のアプロヌチは、 GenericsをTraitItemKind::Typeに入れるこずでした。これは、型宣蚀がすでに栌玍されおいる堎所だからです。 あなたのアプロヌチも理にかなっおいるので、私はそれを実装するこずに取り組みたす。 私はただこのコヌドベヌスに完党に慣れおいないので、あなたが提案したものよりも䜿甚した堎合の私のアプロヌチの萜ずし穎を知りたいず思いたす。 あなたの思考プロセスに぀いおの掞察を教えおください。 スマむリヌ

これが私が行ったであろう倉曎です

pub enum TraitItemKind {
    // Generics aren't supported here yet
    Const(P<Ty>, Option<P<Expr>>),
    // `Generics` is already a field in `MethodSig`
    Method(MethodSig, Option<P<Block>>),
    // Added `Generics` here:
    Type(Generics, TyParamBounds, Option<P<Ty>>),
    Macro(Mac),
}

線集Gitterのnikomatsakisによる回答

それらをタむプするこずの萜ずし穎に関しお
それもうたくいくず思いたす
私がそれをするのを嫌がった理由
メ゜ッドずタむプに察しお少なくずも理論的には同じこずを本圓にやりたいずいうこずです
そしお-私が蚀ったように-原則ずしお、定数に察しお同じこずを行うこずができなかった理由はわかりたせん
Genericsをタむプバリアントに移動するだけだず思いたす
それはおそらくうたくいくでしょうが、あなたが芋おみるず、今、私たちはしばしば「型/定数のために1぀のこず、メ゜ッドのために1぀のこず」をしなければなりたせん。
だから私はコヌドがもっず均䞀になるず思う
正盎に蚀うずどうなるかよくわかりたせん=-それは苊痛かもしれたせん
しかし、span_bugを挿入できるので、倚くの堎合、必芁以䞊に䞀般的なものにするこずはそれほど悪くありたせん。 今のずころ䞍可胜な堎合に電話をかけたすそしお埌で私たちは呚りに来おそれらを修正したす

わかった 次のステップは、パヌサヌを拡匵するこずです。 ここにいく぀かのヒントがありたす。 特性アむテムから始めたしょう。

このルヌチンは、特性アむテムを解析したす。 関連する型を凊理するケヌスを拡匵しお、 type Foo<....> = ...; おそらくwhere-clausesのようなものも解析したいず思いたす。  <...>は、ASTに远加したばかりの「ゞェネリック」です。

珟圚、 parse_ty_paramを䜿甚しおいたす。これは、基本的にT: Fooなどを解析したす。関連付けられた型宣蚀の文法が型パラメヌタヌの文法ず䞀臎しなくなったため、これを停止する必芁がありたす。 したがっお、おそらくparse_trait_item_assoc_tyのようなものを远加したいず思うでしょう。 これはparse_ty_param()の䞀皮のクロヌンずしお開始できたすが、ここでparse_generics()を呌び出すように倉曎する必芁がありたす。 そのルヌチンは、ゞェネリック宣蚀 <...> が存圚する堎合はそれを解析し、存圚しない堎合は空のゞェネリックを返したす。 次に、ここにparse where句の呌び出しを远加したす。メ゜ッドの解析時に発生する呌び出しでモデル化できたす。結果は、前に解析したgenericsに栌玍されるこずに泚意しおください。

これが完了するず、いく぀かの解析テストを远加できるようになりたす。 src/test/run-pass/rfc1598-generic-associated-types/のようなディレクトリを䜜成し、そこに正垞に解析できるず予想されるファむルを远加するこずで、これを実行したす。 今のずころ、それらは正しく機胜したせんが、それは問題ではありたせん。 空のmain関数を远加するだけです。 次に、 src/test/ui/rfc1598-generic-associated-types/に解析しおはならない䟋を远加するこずもできたす UIテストの远加方法に぀いおは、 COMPILER_TESTS.mdを参照しおください。

他の䜕か-安定したビルドでこのようなものを䜿甚する人を避けるために、この時点でこの䜜業を機胜ゲヌトする必芁がありたす。 ここでforgeに機胜ゲヌトを远加するためのいく぀かの手順がありたす最埌のセクションを参照。 feature_gate.rsの蚪問者に$ visit_trait_itemずvisit_impl_itemを远加する必芁がありたす; そのアむテムがメ゜ッドではないが、空でないゞェネリックが含たれおいる堎合は、 gate_feature_postを呌び出すこずができたす䟋。

名前解決を蚭定するには、適切な「リブ」を配眮するだけだず思いたす名前解決機胜は、スコヌプ内の名前のセットをリブに線成したす。各リブは1぀のバむンディングレベルを衚したす。 䟋implの堎合

impl<A,B> Foo<B> for Vec<A> {
   fn bar<T,U>(x: ...) { 
       for y in ... {
       }
   }
}

次のリブがありたす。

- <A,B> (from the impl)
   - <T,U> (from the `bar` method's generics)
      - `x` (from the parameter list)
          - `y` (from the let)

䞀般に、メ゜ッドがどのように機胜するかをモデル化するこずは悪い考えではありたせん。 ここで少し「将来の保蚌」を行うこずもできるず思いたす。

メ゜ッドの型パラメヌタヌをスコヌプに取り蟌むコヌドは次のずおりですこれは、トレむトで定矩されたメ゜ッド甚です。

https://github.com/rust-lang/rust/blob/a35a3abcda67a729edbb7d649dbc663c6feabd4c/src/librustc_resolve/lib.rs#L1890 -L1892

トレむトで定矩されたtypeの堎合、空の型パラメヌタヌrib NoTypeParameters を远加するようにハヌドコヌディングされおいたす。

https://github.com/rust-lang/rust/blob/a35a3abcda67a729edbb7d649dbc663c6feabd4c/src/librustc_resolve/lib.rs#L1897 -L1901

ゞェネリックスがすべおのtrait/implアむテムに配眮されたので、おそらくtypeの凊理を削陀し、メ゜ッド凊理を抜出しお、より高いレベルで発生するようにしたいず思いたす。 ゞェネリックがないアむテムたずえば、 const の堎合、新しく導入されたリブは空であるため、無害である必芁がありたす私は願っおいたす。

その他の興味深い点

あなたはその考えを理解したす。

@petrochenkov-正しいず思いたすか

@nikomatsakis

正しいですか

すべおが正しく芋えたす。

次のステップ。 生涯の解決。

良くも悪くも、これは珟圚、他の名前解決ずはたったく別のコヌドで行われおいたす。 これは、HIRが構築された埌に行われるためです。 ほが確実にこれは倉曎されたすが、ただ倉曎されおいたせん。

基本的な考え方は通垞の名前解決ず同じですが、「リブ」ではなく「スコヌプ」ず呌ぶ点が異なりたす。 =

この「レむトバりンド」ラむフタむムの抂念のために、いく぀かの軜床の問題がありたす。 ただし、ここでは実際には関係ありたせん。ゞェネリック関連タむプのすべおのラむフタむムは「早期バむンド」になりたす。これは䞀皮の単玔なケヌスです。 「レむトバりンド」ラむフタむムは、メ゜ッドが呌び出されるたで倀が提䟛されないメ゜ッドたたは関数で宣蚀されたラむフタむムです。 ここではそれほど関連性がないため、ここでは詳しく説明したせん。䞻なこずは、他の名前解決ずは異なり、他の皮類の䞀般的なアむテムの堎合ずたったく同じモデルのメ゜ッドをたどりたくないずいうこずです。ケヌス。

これがコヌドの䟋です。 これは、 impl 、 struct 、たたはその他の非機胜アむテムにアクセスするコヌドです。 これらの堎合、GATの堎合ず同様に、基本的に、 Genericsのすべおのラむフタむムパラメヌタをスコヌプに取り蟌み、それらを「早期バむンド」ラむフタむムにマッピングしたす。

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L370 -L388

最初にラむフタむムのベクトルを䜜成し、それぞれに察しおRegion::earlyを呌び出しおいるこずがわかりたす。

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L376 -L378

次に、 Scopeを䜜成したす。 next_early_index倉数は、スコヌプ内にあるアヌリヌバりンドラむフタむムの数をカりントしおいるだけです。 このコヌドはアむテムに固有であるため、これは垞に、この珟圚のアむテムで宣蚀されたアヌリヌバりンドラむフタむムの数になりたす。 埌で、远加のラむフタむムをスコヌプに远加する堎合を怜蚎したす。これは、GATに必芁なものです。

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L379 -L384

最埌に、 with()を呌び出したす。 このメ゜ッドは、スコヌプをスコヌプに取り蟌み、クロヌゞャを呌び出したす。 このクロヌゞャ内でアクセスするすべおのラむフタむムには、スコヌプ内にあるず定矩した名前が衚瀺されたす。

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L385 -L388

では、もう1぀の䟋を芋おみたしょう。 このケヌスは「impl特性」をカバヌしたす。 それが行っおいるこずの詳现はそれほど重芁ではありたせん぀たり、 impl Traitの脱糖自䜓を行う必芁はありたせん。 それは、いく぀かの新しい初期のラむフタむムをスコヌプにもたらしおいるず蚀えば十分です-それはたさに私たちがGATのためにやりたいこずです。

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L482 -L501

いく぀か匷調しおおきたす。 たず、メ゜ッドnext_early_indexは、次の割り圓おられおいないアヌリヌバりンドむンデックスを返したす。

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L488

それが出発点です。 次に、 Region::earlyを再床䜿甚しお、以䞋に察しお解決される新しいアヌリヌバりンドラむフタむム定矩を䜜成したす。

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L490 -L492

最埌に、 withを再床呌び出すこずで、これらをスコヌプに入れたす。

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L494 -L501

OK、これらは2぀の䟋です。 2番目のようなこずをしたいず思いたす。 これら2぀のメ゜ッドの定矩を倉曎する必芁がありたす。

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L509

https://github.com/rust-lang/rust/blob/ddaebe938b8eb1f5e17570ae8091743972e02bdd/src/librustc/middle/resolve_lifetime.rs#L520

どちらも、関連するタむプに぀いお、関連するゞェネリックを凊理する必芁がありたす。 他の堎合には、ゞェネリックが空であるず䞻匵する必芁がありたす。

それで、私は今日早くこれに飛び぀きたした。 私は正しい軌道に乗っおいるこずを確認したいず思いたす

  • 実行する必芁があるのは、マップにラむフタむムを導入しおから、trait / implアむテムをりォヌクするこずだけでしたか チェックは機胜しおいるようですが、わかりにくいですが埌述...単玔な無制限の堎合にのみ機胜しおいる可胜性がありたす。
  • type parameters are not allowed on this type゚ラヌを修正するために、 qpath_to_tyずassociated_path_def_to_tyの型パラメヌタヌの犁止を$$ librustc_typeck/astconv.rs $$に削陀したした。 いく぀かのチェックに眮き換える必芁があるず思いたす。 たた...
  • typeckからクラッシュが発生しおいたす。 具䜓的には曞き戻し

typeckの倱敗は、関連付けられた型を持たない倀にゞェネリックスを提䟛するため、 src/test/compile-fail/struct-path-associated-type.rsでトリガヌされたす。

私が物事を正しく読んでいるなら、少なくずも関連するゞェネリックカりントが䞀臎するチェックを远加する必芁がありたすそれをどこで行うかを芋぀けようずしおいたす...、そしおおそらくノヌドなどのタむプを远加するために他のチェックを行うこずもできたす。

それに取り組む぀もりですが、私が正しい方向に進んでいるかどうかに぀いおの指針は高く評䟡されおいたす。

こんにちは@brandonson 誰かがRustコンパむラをハッキングするのを思いずどたらせるのは嫌ですが、 @ sunjayはすでに同じものを積極的にハッキングしおいお、最初からこの倉曎を远求しおいるず思いたす。この倉曎も同様ですすでに開始されおいるず思いたす。 この取り組みを䞊行化する明癜な方法があるかどうかはわかりたせん確かに可胜ですが、少し前に手順を緎り䞊げる必芁がありたす。

ただし、取り組むべきものを芋぀けるこずに興味がある堎合は、このマむルストヌンのバグのいく぀かに取り組むこずをお勧めしたすか https://github.com/rust-lang/rust/issues/46472は話されおいないようです、私はすぐにそこにいく぀かのコメントを残すこずを詊みるこずができたす。

確かに私は誰かの぀た先を螏む぀もりはありたせんが、実際にさらなる進歩が起こっおいるこずを瀺すものは䜕も芋られたせんでした確かに次のステップに関するコメントはかなり最近のものですが。 本圓に、ここ数日でGATが数回欲しかったので、これを解決しようずし始めたした。将来、NLLの䜜業を行う必芁はありたせんが、これは解決すべき事項のリストの䞊䜍にありたす。この時点で。

@sunjay 、あなたがただこれに積極的に取り組んでいる/蚈画しおいるなら、私に知らせおください-私にあなたの仕事を耇補させおも意味がありたせん。

こんにちは@brandonson 、あなたの熱意ず助けおくれる意欲に感謝したす。 :)私は確かにこれに積極的に取り組んでいたす。 ニコず緊密に協力しながら、実装の各郚分を段階的に進めおきたした。

私はこれをできるだけ早く取り陀くためにできる限りのこずをしたす。 私もこの機胜が本圓に欲しいです

進捗状況はどうですか =毎晩<3でこれを詊すのが埅ちきれたせん

GATずconstゞェネリックの断面はどのように機胜するのでしょうか。たた、たずめたずきに提案の䞀郚だったのでしょうか。

私が蚀っおいるこずの䟋

trait Foo {
    type Bar<const N>;
}

こんにちは@sunjayこれは非垞に重芁な機胜だず思いたす。2018幎のロヌドマップのコメントで頻繁に蚀及されたした。 順調に進んでいたすか あなたの仕事をありがずう

これは、珟時点で私の最も望たしい機胜です。 これが優先事項になり、すぐに毎晩その道を芋぀けるこずを願っおいたす

そこで最近、孊校などで忙しい@sunjayに䌚い、次のステップを考えおみたした。 圌らず私はある時点で䌚い、党䜓的な実装戊略に぀いお話し合い、最終的に圌らのリポゞトリにコミットし、むンラむンコメントをたくさん残したした。

今埌最も理にかなっおいる戊略は2぀あるず思いたす。

  • たず、さらにいく぀かのテストを䜜成する必芁がありたす。
  • パヌサヌずシステムの他の「フロント゚ンド」ビットにはいく぀かの既知の欠点があり、それらを列挙しお修正する必芁がありたす。 おそらくテストでもっず芋぀かるでしょう。
  • その時点で、トレむトシステムを適切にハッキングする準備が敎いたした。

    • 䞀郚の基盀はすでに構築されおいるため、これは䞻に「リファクタリング」タスクであるこずが望たれたす。

    • しかし、私は詳现に曞く必芁がありたす、私が知っおいる蚈画の曞面による説明はありたせん、そしお私は今のずころそれのための時間がありたせん。

たず、いく぀かの呜什retestsを䜜成するこずから始めたす。これは、テストの方がすぐに実行できるためです。今週の埌半に、残りの蚭蚈がどのように機胜するか、およびコヌドを珟圚の堎所から取埗する方法を蚘述したす。今それが必芁な堎所に。

それは玠晎らしいです  これず他のすべおの努力で@sunjayに幞運を祈りたす。

最初のステップは、完党なテストスむヌトがあるこずを確認するこずです。 既存のテストは次の堎所にありたす。

src/test/ui/rfc1598-generic-associated-types

それらを芋るだけで、実行する必芁のある䜜業の䞀郚をすでに確認できたす。

  • [] construct_with_other_type.rs -予期しないE0110゚ラヌが発生したす
  • [x] empty_generics - type Bar<,>で゚ラヌが発生するこずを確認し、問題ないようです
  • [x] generic-associated-types-where.rs -適切な堎所でwhere句を解析できるこずを確認したす。問題ないようです。
  • [] generic_associated_type_undeclared_lifetimes.rs -予期しないE0110゚ラヌが発生したす
  • [] iterable.rs -予期しないE0110゚ラヌが発生したす
  • [] pointer_family.rs -予期しないE0109゚ラヌが発生したす
  • [] streaming_iterator.rs -予期しないE0110゚ラヌが発生したす

カバレッゞが䞍足しおいる堎所

  • []珟圚、「予想される䜿甚法」のテストはあたりありたせん。぀たり、成功するはずのテストです。

    • pointer_familyはその方向にあるようです

    • ある皮のtrait Iterable { type Item; type Iter<'a>: Iterator<Item = &'a Self::Item>; }テストを期埅したす

  • []生涯シャドりむングテスト-私たちは䞀般的に生涯シャドりむングを犁止しおいるので、これらは違法であるはずです

    • trait Foo<'a> { type Item<'a>; }

    • impl<'a> Foo<'a> for &'a u32 { type Item<'a> = i32; }

  • []「完党修食」構文はテストされおいないようです

    • たずえば、 pointer_familyテストにはSelf::Pointer<T>がありたすが、 <Self as PointerFamily>::Pointer<T>はありたせん

  • []GATに察する匕数の数が間違っおいたす。 たずえば、䞊蚘のIterableの定矩が䞎えられた堎合

    • <T as Iterable>::Item -パラメヌタがたったくありたせんか 悪い。

    • 䞀郚の同等のコンテキストではラむフタむムの削陀を蚱可するため、䞀郚のコンテキストではこれを受け入れる堎合があるこずに泚意しおください。

      私はここでどちらの方向にも行くこずができたした。 このような堎合は、明瀺的な'_を曞くこずをお勧めしたす。

    • <T as Iterable>::Item<'_> -正解です。

    • <T as Iterable>::Item<T> -タむプが倚すぎたす

    • など、もちろんタむプず寿呜の䞡方をずるテストがあるずいいでしょう

  • []関連するタむプのデフォルト trait Foo { type Bar<T, U = T> where T: PartialEq<U>; }

    • その堎合、 SomeType::Bar<u32>はSomeType::Bar<u32,u32>に盞圓したすが、これを確認する必芁がありたす。

予期しないE0110゚ラヌの修正

゚ラヌE0110はprohibit_type_paramsによっお報告されたす

https://github.com/rust-lang/rust/blob/e65547d4fad0425d1db4f33a4d8134bf2cad939e/src/librustc_typeck/astconv.rs#L912

最初のステップは、それがどこから呌び出されおいるかを把握するこずです。 これを行うための私の奜たしい方法は、ロヌカルビルドを取埗し、 -Ztreat-err-as-bugをRUST_BACKTRACE=1ず組み合わせお䜿甚​​するこずです。 しかし、rustcはただ構築䞭であるため、これらの結果を衚瀺するこずはできたせん。 P代わりに、簡単なrg prohibit_type_paramsを実行したした。次に、疑わしいケヌスを1぀指摘したす。

1぀の呌び出しはassociated_path_def_to_tyからです

https://github.com/rust-lang/rust/blob/e65547d4fad0425d1db4f33a4d8134bf2cad939e/src/librustc_typeck/astconv.rs#L791 -L803

コメントが瀺すように、これはSelf::Pointer<T>のようなパスのPointer<T>コンポヌネントを解決するために呌び出されたすタむプパラメヌタヌは、それらが接続されおいる名前ずずもに、パスセグメントの䞀郚ず芋なされるこずに泚意しおください 。 GATが登堎するたで、タむプパラメヌタはそこでは合法ではなかったためたずえば、 T::Item 、包括的な制限がありたす。

https://github.com/rust-lang/rust/blob/e65547d4fad0425d1db4f33a4d8134bf2cad939e/src/librustc_typeck/astconv.rs#L810

明らかにこれはしたせん。 その行を削陀しお、パラメヌタが指定されおいる堎合はそれらが期埅される数ず䞀臎するこずを確認する䜕らかのチェックに眮き換える必芁がありたす。 これを行うには、おそらくcreate_substs_for_ast_pathにあるものず同様の゚ラヌチェックコヌドが必芁です。 特にデフォルトでのアカりンティングのために、ここで共有コヌドを䜜成したいず思うかもしれたせん。実際にその関数を再利甚できるでしょうか。

誰かがただこれに取り組んでいたすか これにはただ長い道のりがあるように思えたす。 GATは私の最も望たしいRFCです。 そうでない堎合は、いく぀かのテストに貢献したいず思いたす...

@rickyhanなので、 @ Centrilず@gaventoは、テスト䜜業を分割するこずに぀いおWGの特城に぀いお話しおいたしたが、進展があったかどうかはわかりたせん。 チャむムを鳎らすこずができるかもしれたせん。PRは倧歓迎だず思いたす。 =

私が愚かであるならば申し蚳ありたせんが、この皮のこずはGATで合法になるのでしょうか

trait Sequencer {
    type Wrap<A>;
    fn chain<A, B, F>(Self::Wrap<A>, F) -> Self::Wrap<B>
        where F: FnOnce(A) -> Self::Wrap<B>;
    fn wrap<A>(A) -> Self::Wrap<A>;
}

これの状況はどうですか 私はチョヌクが最近ガットサポヌトを埗たこずを知っおいたす。 それはすぐに錆びお着陞するこずを意図しおいたすか

@mark-im先週私はそれにショットを䞎えたした。 私の理解では、構文パヌサヌはそこにありたすテストはありたせんが。 しかし、「実装」はただ曞かれおいたせん。 詳现に぀いおは、https//github.com/rust-lang/rust/issues/44265#issuecomment-330915766を参照しおください

@quadrupleslap AIUI、これは埌で可胜になりたすが、最初は、GATは有効期間パラメヌタヌのみをサポヌトしたす。

@Boscop RFCは、タむプパラメヌタもサポヌトされるこずを指定しおいたす。

誰かがrustcの構文の実装の正確なステヌタスを知っおいたすか ほずんどがそこにあるように芋えたすが、ランクの高い境界はICEを生成したす。
http://play.rust-lang.org/?gist=a48959858ed5dd432c2396feae5c3cc1&version=nightly&mode=debug

チョヌク化䜜業を進めるには、少なくずも構文党䜓を実装する必芁がありたす。 ただ構文に取り組んでいる人がいる堎合は、私に知らせおください。そうしないず、自分で修正する可胜性がありたす:)

私には、コミュニケヌションがGATの実斜を遅らせる倧きな問題のように芋えたす。 これに取り組むこずに興味を持っおいる人は少なくずも数人いるようですが、正確な実装状況ず誰がすでにこれに取り組んでいるのかを実際に知っおいる人は誰もいたせん。 GATの実装に぀いお話すためだけに、DiscordたたはIRCチャネルに぀いおどう思いたすか それは確かに圹立぀ず思いたす。

たた、私は確かにこれに取り組むために次の週の数営業日に貢献するこずができたしたしかし私はただコンパむラのこの郚分に぀いお䜕も知りたせん。

そこで、Discordの専甚チャンネルをリク゚ストしたした。 しかし、チャンネルを取埗する代わりに、私はいく぀かのこずを孊びたした。 たた、GATに関連するすべおのものを怜玢したした。 したがっお、この機胜に関するすべおの情報を芁玄しようず思いたす。 倚分それは䜕人かの人々に圹立぀でしょう。 でも䜕もわからないので、これを䞀粒の塩でどうぞ たた、修正できるように、䞀郚の情報が正しくない堎合は教えおください。

GATに関する実斜努力の芁玄

それ以来、 UIテストは远加されおいたせん。 たた、GATに盎接関連する他のPRは芋぀かりたせん。

ただし、䞊からのポむントc圢質システムは「秘密裏に」取り組んでいたす。 私が理解しおいる限り、蚈画はすぐに新しいチョヌクベヌスの特性゜ルバヌに移行し、叀いシステムでGATを機胜させないこずです。 新しい特性゜ルバヌの統合は、「チョヌク化」远跡問題による远跡です。 チョヌクずチョヌク化に関連するPRはかなりありたす。 特に、 「FinishimplementingGATs」 2018-05-24に統合ず呌ばれるチョヌクPRがありたす。 したがっお、GATのコアシステムはすでに敎っおいるようです。

ずは蚀うものの、チョヌクの「GAT」はプロトタむプの実装であり、rustcでそれを䜿甚するこずは単なるuse chalk;ではありたせん。 @scalexmが私に蚀ったように、「[やるべきこず]はかなりたくさんあるようです」。


詳现ず支揎に぀いおは、 #wg-traits Discordチャネルず特性WG远跡の問題を調べるず圹立぀でしょう。

そのため、 @ nikomatsakisはrust-lang䞍和サヌバヌに#wg-traits-gatチャネルを䜜成したしたここに参加しおください。 そこで助けたいず思っおいるすべおの人を迎えるこずができれば玠晎らしいず思いたす。 さらに、この機胜のステヌタス特に、ただ䜕をする必芁があるのか​​、どこで支揎できるのかを知っおいる数人の人々。 これにより、特に、ただ深く関わっおいない/特性WGの䞀郚である私のような人々にずっお、コミュニケヌションがより簡単か぀迅速になるはずです:)

最近、これに関する曎新はありたすか Chalkがコンパむラに統合されるのを埅っおいたすか おそらく、そのための別の問題がありたす。

おそらく、そのための別の問題がありたす。

48049

泚おそらく既知ず同様に、このコヌドはコンパむラヌをパニックにしたす。

use typenum::{U1,U2,U3,Unsigned};

trait Array {
    type Of<Elem> ;
}

impl Array for U1 { type Of<T> = [T;1]; }
impl Array for U2 { type Of<T> = [T;2]; }
impl Array for U3 { type Of<T> = [T;3]; }

@varkor玠晎らしい、ありがずう

さらに別のメモここでも、おそらく知られおいたす。 GATを蚭定するず、 &型ず&mut型をうたく抜象化できるため、関数my_funcずmy_func_mutの間でコヌドを垞にコピヌしお貌り付けるのをやめるこずができたす。

#![feature(arbitrary_self_types)]
#![feature(generic_associated_types)]

use std::marker::PhantomData;

struct Pure <'t> (PhantomData<&'t()>);
struct Mut  <'t> (PhantomData<&'t()>);

type Ref<M, T> = <M as Acc>::Pat<T>;

trait Acc { type Pat<T: ?Sized>; }
impl<'t> Acc for Pure <'t> { type Pat<T> = PureRef <'t, T>; }
impl<'t> Acc for Mut  <'t> { type Pat<T> = MutRef  <'t, T>; }

struct PureRef <'t, T: ?Sized> (&'t     T);
struct MutRef  <'t, T: ?Sized> (&'t mut T);


/// USAGE ///

struct Buf<T> {
    data: Vec<T>
}

impl<T> Buf<T> {
    fn as_mut<M: Acc>(s: Ref<M, Self>) -> Ref<M, [f32]>
    {
        unimplemented!()
    }
}

ほずんどコンパむルされたす。 GATなしで実装するこずもできたすが、タむプは爆発したす。

#![feature(arbitrary_self_types)]

use std::marker::PhantomData;
use std::ops::Deref;

struct Pure <'t> (PhantomData<&'t()>);
struct Mut  <'t> (PhantomData<&'t()>);

type Ref<M, T> = <M as Acc<T>>::Pat;

trait Acc<T: ?Sized> { type Pat; }
impl<'t, T: 't + ?Sized> Acc<T> for Pure <'t> { type Pat = PureRef <'t, T>; }
impl<'t, T: 't + ?Sized> Acc<T> for Mut  <'t> { type Pat = MutRef  <'t, T>; }

struct PureRef <'t, T: ?Sized> (&'t     T);
struct MutRef  <'t, T: ?Sized> (&'t mut T);


/// USAGE ///

struct Buf<T> {
    data: Vec<T>
}

impl<T> Buf<T> {
    fn as_mut<M>(self: Ref<M, Self>) -> Ref<M, [f32]>
    where M: Acc<Self> + Acc<[f32]>,
          Ref<M, Self>: Deref<Target = Self>
    {
        unimplemented!()
    }
}

これは実際にコンパむルされたす

おそらくこれはサポヌトの質問ですが、 RFCたたはここのコメントから完党に明確ではなかったので、このペヌゞに来る人がこの提案を理解するのに圹立぀かもしれないず思いたす

毎晩1.41で、私は次のこずを詊したした。

pub trait MyTrait {
    type MyType<U>;

    fn f<U>(self, x : <Self as MyTrait>::MyType<U>);
}

そしお、これはコンパむルに倱敗し、゚ラヌは「タむプ匕数は蚱可されおいたせん」 MyTypeです。

次に、疑わしいず思われる<U>を削陀したしたが、詊しおみようず思いたした。

pub trait MyTrait {
    type MyType<U>;

    fn f<U>(self, x : <Self as MyTrait>::MyType);
}

驚くべきこずに、これはコンパむルされたした。 しかし、私がimplを曞いたずき

impl MyTrait for u64 {
    type MyType<U> = U;

    fn f<U>(self, x : <Self as MyTrait>::MyType) -> <Self as MyTrait>::MyType {
        x;
    }
}

これはコンパむラをパニックにしたした。

私の質問は次のずおりです。

  1. この皮のスキヌムは珟圚可胜ですかしかし、私はそれを間違っおいるだけですか
  2. 今それが䞍可胜な堎合、この提案の䞋でそれは可胜になるでしょうか
  3. もしそうなら、私が毎晩これを行うこずができるようなタむムラむンのアむデアはありたすか

お時間を割いおいただき、誠にありがずうございたす。

@clintonmead最終的には可胜になるはずですが、機胜の実装はただ完了しおいたせん実際、コンパむラは、䜿甚しようずするずクラッシュする可胜性があるこずを譊告しおいたす。 タむムラむンがわかりたせん。

おそらく、この機胜の䜜業を再開するために統合が十分に進んでいるかどうかをチョヌクの人に確認する䟡倀がありたすか

これは珟圚ブロックされおいたす

  • 30472
  • 67509
  • 67510
  • 67512
  • 67513

珟圚のブロッカヌで問題の説明を曎新できたすか

@DutchGhostによっお発生したブロッキングの問題をさらに远加したした

これは、より皮類の倚いタむプの゚ミュレヌションにおける䞻芁なステップになりたす。

私はこのようなものを想像しおいたす

// the plug/unplug idea is from https://gist.github.com/edmundsmith/855fcf0cb35dd467c29a9350481f0ecf

trait Monad /* : Applicative (for pure/return, doesn't matter for this example) */ {
    // Self is like the "f a" in haskell

    /// extract the "a" from "f a"
    type Unplug;

    /// exchange the "a" in "f a" in the type of Self with B
    type Plug<B>: Monad;

    fn bind<B, F>(this: Self, f: F) -> Self::Plug<B>
    where
        F: Fn(Self::Unplug) -> Self::Plug<B>;
}

impl<A> Monad for Option<A> {
    type Unplug = A;
    type Plug<B> = Option<B>;
    fn bind<B, F>(this: Self, f: F) -> Option<B>
    where
        F: Fn(A) -> Option<B> {
        this.and_then(f)
    }
}

提案された実装に関する質問

私はこのような特城を持っおいたす

trait TradeableResource{
}

ずこのような実装者

struct Food(f64);
impl TradeableResource for Food{}

私の特性のすべおの実装者を「ニュヌタむプ」f64をラップする単䞀芁玠のタプル構造䜓に制限できるようにしたいず思いたす。

提案された実装をここで怜蚎するこずで、それは可胜でしょうか

以䞋は確かに少し奇劙に芋えたすが、うたくいけば私がやりたいこずを瀺しおいたす。

trait TradeableResource{
    type Wrapper<T>:T(f64)
}

@ChechyLevasは、私が知る限り、これはGADTの範囲内ではありたせん。

しかし、あなたがやりたいこずは、私が集めるこずができるものから、それがニュヌタむプであるずいう保蚌をあきらめ、代わりにそれぞれ内郚倀をラップしお取埗する関数を必芁ずする堎合、最初にGADTを必芁ずしたせん。 それほど䟿利ではありたせんが、おそらく十分に機胜するはずです。

したがっお、次のこずができたす。

trait Traceable resource: From<f64> + Into<f64> { }

これには、双方向でFromも実装する必芁がありたす。これは、マクロを介しお行いたす

珟状を少し感じおみたいず思いたす。 私は非同期の特性ず生涯で少し遊んでいたす。
私がやりたかったこずの1぀は、関連するReadAt: Futureタむプでtrait ReadAt<'r>を䜜成するこずでした。 これは、特性オブゞェクトを䜿甚する堎合を陀いお、倚くの堎合に機胜したす。

䞻な理由は、次のこずを行うず、䞀般的ではないラむフタむムをRにアタッチする必芁があるためです。

impl<'a, 'r, R> ReadAt<'r> for &'a dyn for<'z> ReadAt<'z, ReadAt = R> + 'a {
    type ReadAt = R; // cannot have an `impl<R<'lifetime>>`
    ...
}

したがっお、これはGATで解決できるかもしれないず思いたしたが、トレむトオブゞェクトでは関連する型を曞き出す必芁があるため、構文の魔法が再び必芁になるずいう同様の問題が発生したした。

お気に入り

trait ReadAt {
    type ReadAt<'r>: Future<Output = io::Result<usize>>;

    fn read_at<'a>(&'a self, buf: &'a mut [u8], at: u64) -> Self::ReadAt<'a>;
}

impl<'d> ReadAt for &'d (dyn ReadAt<HERE> + 'd) {
}

HEREにラむフタむムを含める方法が必芁です。 たずえば、これは受け入れられたすが、 Rは具䜓的すぎるため、IMOでは䞍十分です。

impl<'d, R> ReadAt for &'d (dyn ReadAt<ReadAt = R> + 'd) {
    type ReadAt<'r> = R;

    fn read_at<'a>(&'a self, buf: &'a mut [u8], at: u64) -> Self::ReadAt<'a> {
        (**self).read_at(buf, at)
    }
}

しかし、これが特性オブゞェクトに倉換する方法がわからないため、それがずにかく機胜するかどうかを実際にテストするこずはできたせん。次のスニペットにラむフタむムを取埗する方法がわからないためです。

struct Test<T: ReadAt>(T);

impl<T: ReadAt> Test<T> {
    fn into_trait_object<'a>(&'a self) -> Test<&'a dyn ReadAt<ReadAt = T::ReadAt>> {
        todo!();
    }
}

T::ReadAtは私が提䟛できない寿呜を芁するので、これはdyn ReadAt<ReadAt<'r> = T::ReadAt<'r>>の構文拡匵を芋逃したす。 たたは、ラむフタむムパラメヌタIMOを䞀臎させるために、䞊蚘のスニペットが機胜する可胜性がありたす;-)

タむプパラメヌタではなくラむフタむムパラメヌタのみを䜿甚しおいるので、ラむフタむムパラメヌタがvtablesずタむプサむズに䜕らかの圱響を䞎える可胜性がない限り、これは技術的に可胜であるず思いたすか

@jendrikwコヌドはコンパむルされ、最新のnightly1.46で実行されたす。 カスタムタむプなどでいく぀かのテストを行いたしたが、詳现を確認するためのfpの知識が䞍足しおいたす。

今日、私は、おそらく生涯が十分に䞀般的ではないず思った䜕かのためにGATを䜿甚しようずしたした動䜜するコヌドが続きたす;完党なコヌドファむル

/// Helper trait for "stripping indention" from an object reference
pub trait AsUnindented<'ast> {
    type Output;

    /// Returns a reference to the unindented part of `Self`
    fn as_unindented(&'ast self) -> Self::Output;
}

impl<'ast, T: 'ast> AsUnindented<'ast> for Indented<T> {
    type Output = &'ast T;

    #[inline]
    fn as_unindented(&'ast self) -> &'ast T {
        &self.data
    }
}

impl<'ast, T: 'ast> AsUnindented<'ast> for crate::Block<T>
where
    T: AsUnindented<'ast> + 'ast,
{
    type Output = crate::View<'ast, T, fn(&'ast T) -> T::Output>;

    #[inline]
    fn as_unindented(&'ast self) -> Self::Output {
        crate::View::new(self, T::as_unindented)
    }
}

次に、次のコヌドでGATを䜿甚しおみたした。

pub trait AsUnindented {
    type Output<'ast>;

    /// Returns a reference to the unindented part of `Self`
    fn as_unindented<'ast>(&'ast self) -> Self::Output<'ast>;
}

impl<T> AsUnindented for Indented<T> {
    type Output<'ast> = &'ast T;

    #[inline]
    fn as_unindented<'ast>(&'ast self) -> &'ast T {
        &self.data
    }
}

impl<T> AsUnindented for crate::Block<T>
where
    T: AsUnindented,
{
    type Output<'ast> = crate::View<'ast, T, fn(&'ast T) -> T::Output<'ast>>;

    #[inline]
    fn as_unindented<'ast>(&'ast self) -> Self::Output<'ast> {
        crate::View::new(self, T::as_unindented)
    }
}

それはうたくいきたせん。 䞡方のトレむト実装でE0309  the parameter type 'T' may not live long enough で倱敗したす。 これを修正する方法や、誀解があるかどうかはわかりたせん。 コンパむラヌは、 implレベルでTに境界をアタッチするこずを望んでいたすが、そのレベルでは、ラむフタむム'astはなく、 T: 'staticを制玄したくありたせん。 for<'ast> T: 'astのようなものは機胜したせん。

線集コヌドベヌスの別の郚分にGATを適甚しようずしたしたが、今のずころ1぀の゚ラヌしかスロヌされたせんが、前述の問題の修正に䟝存するため、単玔に修正するこずはできたせん。

アりトラむフバりンドは、関連付けられたタむプに远加できたすトレむトのバヌゞョンでSelf: 'astを䜿甚。 このテストは、これがどのように芋えるかを瀺しおいたす。
https://github.com/rust-lang/rust/blob/db4826dd6ca48663a0b4c5ab0681258999017c7d/src/test/ui/generic-located-types/iterable.rs#L6 -L21

たあ、それは郚分的にしか機胜したせん...


゚ラヌメッセヌゞ

error[E0309]: the parameter type `T` may not live long enough
  --> src/indention.rs:33:5
   |
33 |     type Output<'ast> where T: 'ast = &'ast T;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: consider adding an explicit lifetime bound `T: 'ast`...
   = note: ...so that the type `T` will meet its required lifetime bounds

error[E0309]: the parameter type `T` may not live long enough
  --> src/indention.rs:45:5
   |
45 |     type Output<'ast> where T: 'ast = crate::View<'ast, T, fn(&'ast T) -> T::Output<'ast>>;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: consider adding an explicit lifetime bound `T: 'ast`...
   = note: ...so that the type `T` will meet its required lifetime bounds

error[E0309]: the parameter type `T` may not live long enough
  --> src/indention.rs:59:5
   |
59 | /     type Output<'ast2>
60 | |         where
61 | |             T: 'ast2,
62 | |             O: 'ast2
63 | |         = crate::View<'ast2, T, crate::view::MapViewFn<F, fn(F::Output<'ast2>) -> O::Output<'ast2>>>;
   | |_____________________________________________________________________________________________________^
   |
   = help: consider adding an explicit lifetime bound `T: 'ast2`...
   = note: ...so that the type `T` will meet its required lifetime bounds

error[E0309]: the parameter type `O` may not live long enough
  --> src/indention.rs:59:5
   |
59 | /     type Output<'ast2>
60 | |         where
61 | |             T: 'ast2,
62 | |             O: 'ast2
63 | |         = crate::View<'ast2, T, crate::view::MapViewFn<F, fn(F::Output<'ast2>) -> O::Output<'ast2>>>;
   | |_____________________________________________________________________________________________________^
   |
   = help: consider adding an explicit lifetime bound `O: 'ast2`...
   = note: ...so that the type `O` will meet its required lifetime bounds

コヌドが1぀のステヌゞを通過するず以前は同様の゚ラヌで゚ラヌが発生したしたが、それらの間に、 E0107 sのみで構成される別のカテゎリの゚ラヌが衚瀺されたしたhm。

線集最初のステヌトメント where Self: 'ast を芋逃したした。 その郚分は珟圚修正されおいたす。 続けおみたす。


远加のコンテキスト

わかりたした、次のスニペット

impl<'ast, T, F, O> AsUnindented for crate::View<'ast, T, F>
where
    Self: Clone,
    F: crate::view::ViewFn<T, Output = &'ast O>,
    O: AsUnindented + 'ast,
{
    type Output<'ast2>
        where
            T: 'ast2,
        = crate::View<'ast, T, crate::view::MapViewFn<F, fn(&'ast O) -> O::Output<'ast>>>;

    #[inline]
    fn as_unindented<'ast2>(&'ast2 self) -> Self::Output<'ast2> {
        self.clone().map::<for<'x> fn(&'x O) -> O::Output<'x>, _>(O::as_unindented)
    }
}

゚ラヌ

error[E0631]: type mismatch in function arguments
  --> src/indention.rs:66:67
   |
66 |         self.clone().map::<for<'x> fn(&'x O) -> O::Output<'x>, _>(O::as_unindented)
   |                                                                   ^^^^^^^^^^^^^^^^
   |                                                                   |
   |                                                                   expected signature of `for<'x> fn(<F as view::ViewFn<T>>::Output<'x>) -> _`
   |                                                                   found signature of `for<'x> fn(&'x O) -> _`

<F as view::ViewFn<T>>::Output<'x> ==> &'ast Oず&'x Oが等しくないこずは知っおいたすが、それを修正する方法がわかりたせんコンパむラヌはバむンドされたF: for<'x> crate::view::ViewFn<T, Output = &'x O>を受け入れたせん。
他の詊行゚ラヌ

error[E0582]: binding for associated type `Output` references lifetime `'x`, which does not appear in the trait input types
  --> src/indention.rs:56:39
   |
56 |     F: for<'x> crate::view::ViewFn<T, Output = &'x O>,
   |                                       ^^^^^^^^^^^^^^

トレむト出力タむプの割り圓おでforall<'x>バりンドを衚珟する方法がわかりたせん。

where
    F: crate::view::ViewFn<T, for<'x> Output<'x> = &'x O>,

解析すらしたせん「 + 、 , 、 :: 、たたは>のいずれかが芋぀かり、 =が芋぀かりたした」。

67510トラックがその境界を曞き蟌むこずができたす。 その䟋では、遅延正芏化も必芁になる堎合がありたす60471。

self.clone().mapの特性出力タむプは、実際にはO::as_unindentedのタむプ、぀たりマップの匕数タむプですか
crate::Viewが䜕であるかはわかりたせんが、 map関数は別の匕数を予期する可胜性があるため、型が䞀臎したせん。

@sighoya以前の投皿でリポゞトリをリンクしたした。これは、 crate::view::ViewFn::mapの実装ぞの盎接リンクです。

コンパむラはこれに぀いお䜕ず蚀っおいたすか

where
    for<'x> F: crate::view::ViewFn<T, Output<'x> = &'x O>,

ただ解析したせん。

@matthewjasper 、

Rust Nomiconから、次の構文解析が行われたす。

where for<'a> F: Fn(&'a (u8, u16)) -> &'a u8,

解析されないのはOutput<'x> = &'x 0>を䜿甚しおいるためですか

はい、 Output<'x>=...はその䜍眮では解析されたせん。

rustc 1.46.0-nightlyでコンパむルされなくなったcreate、 grdfがありたす。 最近GATに関しお䜕か倉わったこずはありたすか

そもそもそれを機胜させるためにトリックを䜿わなければならなかったので、私のケヌスは少し奇劙です。 私は本質的に、関連するむテレヌタタむプを持぀Graph特性を持っおいたす。 それを機胜させるために、私はすべおのむテレヌタを別の特性Iterに配眮したした

pub trait Iter<'a, T: 'a> {
    type Triples: Iterator<Item = Triple<&'a T>>;
    type Subjects: Iterator<Item = (&'a T, Self::Predicates)>;
    type Predicates: Iterator<Item = (&'a T, Self::Objects)>;
    type Objects: Iterator<Item = &'a T>;
}

pub trait Graph<T = crate::Term> {
    /// Iterators.
    type Iter<'a>: Iter<'a, T>;

    ...
}

今たでうたく機胜したGraphの実装が1぀ありたす。

impl<'a, T: 'a + Hash + Eq> crate::Iter<'a, T> for Iterators {
    type Objects = Objects<'a, T>;
    type Predicates = Predicates<'a, T>;
    type Subjects = Subjects<'a, T>;
    type Triples = Iter<'a, T>;
}

impl<T: Hash + Eq> crate::Graph<T> for HashGraph<T> {
    type Iter<'a> = Iterators;

    ...
}

rustcを曎新したので、次のように倱敗したす。

error[E0309]: the parameter type `T` may not live long enough
  --> src/hash_dataset.rs:50:2
   |
50 |     type Iter<'a> = Iterators;
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = help: consider adding an explicit lifetime bound `T: 'a`...
   = note: ...so that the type `T` will meet its required lifetime bounds

TはすでにIterの'aにバむンドされおいるので、これは私にはあたり意味がありたせん...

さお、 whereの境界を远加しお、再び機胜させたした。
特性では

type Iter<'a>: Iter<'a, T> where T: 'a;

および実装では

type Iter<'a> where T: 'a = Iterators;

しかし、特に実装においお、 where境界の正確なセマンティクスを理解するかどうかはわかりたせん初めお芋たずき。 たた、なぜ以前は機胜しおいたしたか。

線集私は自分の厄介なハックを削陀し、関連するむテレヌタをトレむト自䜓に入れるこずさえできたした。

@DutchGhostによっお発生したブロッキングの問題をさらに远加したした

https://github.com/rust-lang/rust/issues/74684も远加できたす:)

曞きたくないので、急いで投皿しおください。でも、この機胜はもう3幎近く停滞しおいお、最も望たれおいる新機胜のひず぀だず思いたす。

これはどこにありたすか ここでの最新のステヌタスの抂芁は、 2018幎6月の@LukasKalbertodtによるものです。 「チョヌク化」を埅っおいたすか

玠朎な芳察GATの私の望たしい䜿甚法のほがすべおは、1぀のラむフタむムパラメヌタヌのみを必芁ずしたす。 削枛された生涯のみのバヌゞョンのGATは、より簡単に提䟛できるでしょうか

https://github.com/rust-lang/rust/issues/44265#issuecomment -568247656はやや簡朔な曎新です。

67510は、実装が必芁な最埌の䞻芁なICE/欠萜機胜です。

このRFCはMonadずFunctorを盎接可胜にしたすか それずも、HKTで実行する必芁のある䜜業が他にありたすか

このRFCは、MonadずFunctorを盎接可胜にしたすか それずも、HKTで実行する必芁のある䜜業が他にありたすか

@ibraheemdevRFCは述べおいたす

これは、人々がより高い皮類のタむプに぀いお話すずきに必芁なすべおの機胜を远加するわけではありたせん。 たずえば、モナドのような特性は有効になりたせん。 これらの機胜をすべお䞀床に䞀緒に実装するこずを奜む人もいたす。 ただし、この機胜は他の皮類の高皮類のポリモヌフィズムず䞊䜍互換性があり、それらの実装を劚げるものではありたせん。 実際、郚分適甚など、他の皮類のより高床なものにも圱響を䞎えるいく぀かの実装の詳现を解決するこずで、道を切り開きたす。

@ibraheemdev モナドずファンクタヌを可胜にする最も慣甚的な方法は、ゞェネリック関連の特性を導入するこずだず思いたすが、ゞェネリック関連の型は確かに前提条件です。

GATを必芁ずしないMonadぞのパスはありたすか

@ibraheemdev仮にそうです、HKTを盎接実装しおから、その䞊にMonadトレむトを実装するこずは可胜です。 ただし、その方向で行われおいる䜜業はなく、おそらくそうなるこずはありたせん。そのアプロヌチでは、Rustの問題が実際には解決されないためです。https //twitter.com/withoutboats/status/1027702531361857536

たぶん私は間違っおいたすが、GATは次のようなものを蚱可するず思いたす

trait MonadFamily {
    type Monad<T>;
    fn pure<T>(inner: T) -> Self::Monad<T>;
    fn bind<T, U, F: FnOnce(T) -> U>(this: Self::Monad<T>, f: F) -> Self::Monad<U>;
}

@ibraheemdev

GATを必芁ずしないMonadぞのパスはありたすか

うん、Rustでより高皮類のタむプを゚ミュレヌトする方法を参照しおください。 今でも安定しお動䜜したす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡