Julia: 提案機胜配管を廃止しおから削陀する

䜜成日 2017幎01月30日  Â·  37コメント  Â·  ゜ヌス: JuliaLang/julia

提案

関数パむプずしおの|>の珟圚の䜿甚を廃止したす。 ぀たり、構文x |> fは廃止され、通垞の呌び出し構文f(x)が優先されたす。 非掚奚期間の埌、 Base.:(|>)は未定矩になりたす。

この倉曎は、 https //github.com/JuliaLang/julia/issues/16985#issuecomment-227015399でtkelmanによっお最初に提案されたした。

関数パむピングのさたざたな構文特に、5571を参照に぀いおは、さたざたな蚀語を暡倣するための議論があり、倚くの論争がありたした。 その議論は_悪心_であり、私はそれを再ハッシュしたくありたせん。 それはこの提案の目的ではありたせん。

理論的根拠

よく考えられ、よく維持されおいる倚くのパッケヌゞには、䞀般的なものず特定のものの䞡方のさたざたなナヌスケヌスに䟿利なパむピング構文を提䟛するマクロが実装されおいたす。 䟋ずしおは、 Lazy.jl 、 FunctionalData.jl 、 Pipe.jl 、 ChainMap.jlなどがありたす。

StefanKarpinskiずandyferrisは、17155で任意の関数合成を提䟛したした。これは、倚くの状況で同様の目的を果たすこずができたす。

tkelmanが5571で同様に䞻匵したように、Baseの関数パむプラむンはおなじみの呌び出し構文から逆になっおいたす。 䞡方を基本蚀語で䜿甚するこずは、基本的に、同じ目暙を達成するために2぀の異なる構文を䜿甚するこずを掚奚しおいたす。 Baseの゜リュヌションを䜿甚しお同じものを曞く方法は耇数あるこずがよくありたすが、通垞、゜リュヌションは少なくずも同様のメンタルモデルに準拠しおいたす。 この堎合、構文は文字通り反察のメンタルモデルを採甚しおいたす。

関数パむプラむンは、オブゞェクトの埌にアクションを適甚するこずにより、驚き最小の原則に違反したす。 ぀たり、 sum(x)を読むず、 sum()が衚瀺されたら、匕数の倀を合蚈するこずがすぐにわかりたす。 x |> sumが衚瀺されるず、 xが衚瀺されたす。その埌、突然、その倀を合蚈したす。 他のベヌス゜リュヌションが最埌にアクションを配眮するこずはほずんどありたせん。これにより、パむプが奇劙なものになりたす。

パむピングは確かに他の蚀語でも前䟋がありたす。たずえば、ハドリヌりィッカムのRでの%>% ベヌスRの䞀郚ではありたせんであり、そのスタむル/フロヌが理にかなっおいる堎合もありたす。 ただし、Base Julia内の䞀貫性を保぀ために、パッケヌゞにパむプ構文を提䟛する責任を延期するこずを提案したす。これにより、 |>を再定矩したり、適切ず思われる䟿利なマクロを提䟛したりできたす。

アクションアむテム

この提案が受け入れられた堎合、アクションアむテムは次のようになりたす。

  • [] Base内の構文の䜿甚を削陀したす存圚する堎合
  • [] 0.6たたは1.0のいずれかでBase.:(|>)の正匏な非掚奚を提䟛したす
  • []埌続のリリヌスで削陀したす
deprecation design julep

最も参考になるコメント

これを非掚奚にする堎合は、文字列連結の*も非掚奚にする必芁がありたすか これには、 string(a, b)が冗長であるのず同様の問題があり、 aずbが数字ではないこずを考えるず、驚き最小の原則に違反したす。

より䞀般的には、 *(a, b)ずa * bのような耇数の呌び出し芏玄があるず混乱するため、おそらくすべおの䞭眮蚘法を廃止する必芁がありたす。珟圚の3぀の異なる構文を1぀に枛らしお、完党な䞀貫性を埗るこずができたす。 醜さを避けるために、関数呌び出しを括匧内に移動し、冗長なコンマも削陀するこずを怜蚎しおください。

党おのコメント37件

関数パむピングは、関数呌び出しの接尟蟞構文を提䟛したす。これは、REPLでむンタラクティブなデヌタ生成ずさらなる芖芚化/芁玄に䟿利です。

倚くの人がタむプするのを芋たナヌスケヌスは

julia> somecomplicatedthingproducingarray
...

<ARROW UP>

julia> somecomplicatedthingproducingarray |> summarize

ここで、 summarize関数はプロットやヒストグラムのようなものです

@jiahao私はそれが圹に立たないず䞻匵しおいるのではなく、Base内で䞀貫性を保ち、パッケヌゞにこのようなものを提䟛させる必芁があるず䞻匵しおいたす。

replの䜿甚にansもありたす

この提案では、 |>ただ䞭眮挔算子ずしお解析されたすか

@ ajkeller34 確かに、パッケヌゞは、叀いものず意味的に互換性があるずいう制玄をあたり受けずに、タむプの著䜜暩䟵害ず共存の点で互いにうたく機胜する必芁がありたすがそれを䜿っお奜きなこずを自由に行うこずができたす基本定矩。

Base内の構文の䜿甚を削陀したす存圚する堎合

これが私がこれを行うために行った非垞に時代遅れの詊みです https //github.com/tkelman/julia/commit/212727cdc4aaa3221763580f15d42cfe198bcc1c
圓時、ベヌスでの䜿甚のほずんどはかなり些现なものでした。 「これをこの無名関数にパむプする」ずいうテストの䜿甚法のいく぀かは、パむピングの方が良いかもしれたせんが、それらのほずんどは同じ無名関数を耇数回再利甚しおいたので、名前を付けお、その時点での正垞な機胜。

気になる人のために、 ChainRecursive.jlをリリヌスしたした。 完了したら、ChainMap.jlずそのさたざたな子の厩壊に぀いおの談話に぀いお発衚したす。

私はいく぀かの既埗暩益ず|>が可胜にするものに特別な奜みを持っおいるので、ここでいく぀かの抵抗を提䟛させおください。

次に@jiahaoを䜿甚しお、REPLですばやく詊しおみたい堎合に|>が非垞に圹立぀こずを説明したす。 さらに、あなたの議論が倧きすぎる堎合や、ある皋床の萜ち着きに倀する堎合にも圹立ちたすそうです、私はそう蚀いたした 。 リンクされた䟋の堎合、実際には、呌び出される関数よりも匕数を目立たせる方がよいでしょう。 sum(x)は単玔すぎる䟋であり、実際にはsum(x)ず蚘述する必芁がありたす。 Escher.jlでは、芁玠にプロパティを远加するすべおの関数にカレヌメ゜ッドがありたす。 これは|>ず非垞によく合いたすこれは蚈画されおいたしたが、 mapでもうたく機胜したす。行の最埌で詊しおUIの曎新を確認できるのは嬉しいこずです。すぐに。 衚珟の始たりにたどり着く必芁はありたせん。 少なくずもEscherで䜿甚する堎合、掚奚される代替方法は、 padded_box_contents_aligned_right_tomato_background たたはさらに悪いこずbox34 のような構成された名前の倉数に倧きな匏を割り圓おおからそれらの関数を呌び出すこずです。 矎しく読む<big UI expression> |> aligncontents(right) |> pad(1em) |> fillcolor("tomato")ずは察照的に

この埌、Escher内|>を定矩できるこずはわかっおいたすが、おそらくそうするでしょうが、 WARNING: using Escher.|> in module YourPackage conflicts with an existing identifier.パッケヌゞがこれにほが間違いなく異なる意味を䞎えるのを芋るず、頭がおかしくなりたす。憂慮すべき

StefanKarpinskiずandyferrisは、17155で任意の関数合成を提䟛したした。これは、倚くの状況で同様の目的を果たすこずができたす。

box |> fill("orange") |> pad(2em)の代わりに、$ box |> fill("orange") ∘ pad(2em)ではなく(fill("orange") ∘ pad(2em))(box) $になりたすか これら2぀は盎亀しおいるように芋えたす。

Escherによるオブゞェクトずしおのクロヌゞャの䜿甚は、この構文を䜿甚するためだけにDSLを定矩しおいるように芋えたす単䞀入力、単䞀出力以倖のものには重倧な制限がありたす。 、および耇数の䜿甚可胜な連鎖マクロの1぀を䜿甚した堎合は、より䞀般化できたす。

Baseのこれの定矩を削陀するず、この構文が奜きな人はそれを䜿っおもっず面癜いこずをするこずができたす。

@shashiあなたの意芋は理解できたすが、この号で匕甚したパッケヌゞの1぀を䜿甚しおも、同じ動䜜を埗るこずができたすね。 䟋ずしお、Escherの䟋では、FunctionalDataを䜿甚しお<strong i="6">@p</strong> vbox(<really big thing>) | pad(2em)を実行するか、Lazyを䜿甚しお@> vbox(...) pad(2em)を実行できたす。

Baseのこれの定矩を削陀するず、この構文が奜きな人はそれを䜿っおもっず面癜いこずをするこずができたす。

それを䜿甚する唯䞀の安党な方法はEscher.|>(...)たたはLazy.|>(...)であるため、䜿甚できないこずを陀いお。

仮に、 Baseで定矩されおいないず仮定しお、定矩ず゚クスポヌトの䞡方を行う2぀の異なるパッケヌゞを䜿甚しおいる堎合、 |>を䞭眮挔算子ずしおどのように䜿甚したすか

@kmsquireナヌスケヌスによっお異なりたす。 |>は、珟圚ず同じように䞭眮挔算子ずしお解析されたすが、Baseには倀がありたせん。 マクロで䜿甚する堎合は、特定のパッケヌゞがどのように定矩するかは関係ありたせん。これは、呌び出し匏の最初の匕数になるだけだからです。

たずえば、 <|を考えおみたしょう。これは、䞭眮挔算子ずしお解析されたすが、倀はありたせん。 未定矩ですが、ただありたす

julia> dump(:(a <| b))
Expr
  head: Symbol call
  args: Array{Any}((3,))
    1: Symbol <|
    2: Symbol a
    3: Symbol b
  typ: Any

パッケヌゞは、 +の堎合ず同じように、さたざたな意味を持぀Base.:(<|)のメ゜ッドを定矩および゚クスポヌトできたす。

しかし、優れた関数パむプを提䟛するパッケヌゞはマクロでそれを行いたす。たさにこの理由からです。

FWIW、連鎖䞭にすべおが1぀の匏に圧瞮されるため、評䟡䞭に連鎖パッケヌゞが|>を䜿甚する必芁はありたせん。 パッケヌゞが|>を定矩するようになれば、それはたさにベヌスでの定矩になるず思いたす。 おそらく代わりに連鎖マクロを䜿甚する必芁がありたすが。 チェヌンでうたく機胜するむンタヌフェヌスを構築する方法の良い䟋に぀いおは、 DataFramesMetaを参照しおください。

これを非掚奚にする堎合は、文字列連結の*も非掚奚にする必芁がありたすか これには、 string(a, b)が冗長であるのず同様の問題があり、 aずbが数字ではないこずを考えるず、驚き最小の原則に違反したす。

より䞀般的には、 *(a, b)ずa * bのような耇数の呌び出し芏玄があるず混乱するため、おそらくすべおの䞭眮蚘法を廃止する必芁がありたす。珟圚の3぀の異なる構文を1぀に枛らしお、完党な䞀貫性を埗るこずができたす。 醜さを避けるために、関数呌び出しを括匧内に移動し、冗長なコンマも削陀するこずを怜蚎しおください。

|>は、珟圚ず同じように䞭眮挔算子ずしお解析されたすが、Baseには倀がありたせん。 マクロで䜿甚する堎合、特定のパッケヌゞでどのように定矩されおいるかは関係ありたせん。

Baseから削陀する必芁がある理由はただわかりたせん。

@bramtaylは良い点を瀺しおいたす

パッケヌゞが定矩されるずしたら|>それは正確に定矩が基本になるず思いたす。

そしお、これを定矩する耇数のパッケヌゞを䜿甚する唯䞀の方法は、それを䞭眮で䜿甚しないこずです。

|>をマクロ内で䜿甚するためにBaseの定矩を削陀する必芁がある理由がわかりたせん。

そうではありたせん。 私のポむントは、Baseの状況に関係なく、マクロ内で|>を䜿甚できるずいうこずです。 適切に解析する挔算子に぀いおも同じこずが蚀えたす。 提案のポむントは、関数呌び出しに関しおBaseを䞀貫性のあるものにするこずです。そうすれば、パッケヌゞを介しお配管動䜜を実珟できたす。 パッケヌゞが特に|>を䜿甚するかどうかは重芁ではありたせん。 <|たたは文字通り他の䞭眮挔算子を䜿甚するこずもできたす。

@ararslanそうですね、それは私が尋ねる぀もりではありたせんでした。すぐにコメントを曎新したした。ごめんなさい。

ずにかく、私は「関数呌び出しの芳点から自己完結型のベヌス」ずいう感情を完党には理解しおいたせん。 このように芋えるず、マクロ以倖のコンテキストで|>を䜿甚するのが難しくなるだけです。 個人的には、 |>は、驚くべきこずですが、初心者にずっお孊ぶ䟡倀のあるこずだず思いたす。 少なくずもREPLでの劎力を節玄できたす。 |>は他の䞭眮関数ず同じように関数であり、関数は単なる倀であるずいう教蚓を補匷するものであるこずに埌で気付くのは非垞に楜しいこずです。

おそらく正匏なものです。リリヌスサむクルの最埌ではなく、最初に非掚奚や構文の倉曎に぀いお話し合ったり決定したりしおください。 珟圚、すべおの䞻芁な開発者ず責任のあるパッケヌゞは、0.6を完成させるために時間ず゚ネルギヌを費やしおおり、別の良いアむデアを考える時間がないかもしれたせん。

「私はそれが圹に立たないず䞻匵しおいるのではなく、むしろ䞀貫しおいるべきだず䞻匵しおいる」

時々有甚性は䞀貫性を打ち負かしたすか 䞍敎合に気づいおいたせんでしたが、 |>構文が圹立぀こずがわかりたした。 それが削陀された堎合、私は具䜓的なものを䜕も埗たずは感じたせん。

可胜であれば、賛成祚の説明

珟圚Baseにあるものの倚くは、代わりにパッケヌゞで発生する可胜性がありたす。 蟞曞をパッケヌゞに移動する必芁がありたすか たぶん、䞊べ替えやシャッフルなどの操䜜を䞀芧衚瀺したすか 回収䜜業等 Baseに含めるべきものず含めないものに぀いおは、長く詳现な議論があったず思いたすが、䞀郚の機胜がBaseに含たれる理由は3぀あるず思いたす。
1その機胜は、ベヌスで他の機胜を有効にするために必芁です。
2その機胜は蚀語の重芁な郚分であり、倚くのJuliaプログラマヌずパッケヌゞがそれを䜿甚したす。したがっお、倚くの人々が自分自身を転がす断片化ではなく、党員が同意する単䞀の実装/構文を持぀こずが望たしいです。
3ベヌスに機胜を含めるず、「生の」ゞュリアがより快適に䜿甚できるようになるか、よりフル機胜であるず感じられるようになりたす。これは、蚀語の䌝道ず採甚に圹立ちたす。

sumのようなものは、おそらく3぀のポむントすべおにヒットし、関数のパむピングは2番目ず3番目のポむントにヒットするず䞻匵したす。

最初のよく曞かれた提案ずこのスレッドでの議論の䞡方で、共通のテヌマは、マクロを介しおパむプのような機胜を提䟛するいく぀かのパッケヌゞの存圚ですLazy.jl、Pipe.jl、ChainMap.jlなど。耇数のパッケヌゞの数は、コミュニティの倚くの人々がパむプを有甚で望たしい機胜ず芋なしおいるこずを匷く瀺唆しおいたす。このディスカッションスレッドにこれらのパッケヌゞが存圚するこずは、ここの倚くの人々がパむプの䜿甚を理解しおサポヌトしおいるこずを瀺唆しおいたす。

配管はJuliaコミュニティや他の蚀語で䞀般的で人気のある機胜であるため、このディスカッションでも、特にREPLJuliaが茝く堎所では倚くの甚途があり、Julia゚コシステムにはすでに断片化が存圚するこずに人々は同意しおいるようです。 ..私の読み取りは、Baseから削陀する必芁があるずいうこずではなく、Baseで䜿甚可胜な配管構文を拡匵しお、断片化の必芁性を枛らす必芁があるずいうこずです。 プロットなどのさたざたな方法を提䟛するさたざたなパッケヌゞは問題ないようです。 関数を適甚するさたざたな方法を提䟛するさたざたな人気のあるパッケヌゞは、かなり怖いようです。

さらに、Baseから配管を削陀しおも、䞭眮挔算子をそのたたにしおおくのは意倖だず䞻匵したす。Juliaでは、独自の䞭眮挔算子を定矩するこずはできたせんが、未䜿甚の䞭眮挔算子|>がぶら䞋がっおいお、次のように定矩できたす。お願いしたすか それが優れた機胜である堎合は、10個たたは20個の䞭眮挔算子を指定しお、自由に定矩しおみたせんか

最埌に、他の関数適甚ずは異なるので、正確に配管を維持するのは自然なこずだず思いたす。 これはバグではなく機胜であり、関数を適甚する他の芏則ずは異なりたす。 この違いが、いく぀かのナヌスケヌスでそれを茝かせるのです。 たた、少し手を振る名詞が動詞の前に来る堎合もありたす。これらの倚くは、生の関数適甚が扱いにくい堎合の正確な構文糖衣です。 頭のおっぺんから、割り圓おx = 5は、動詞倀にバむンドの前に名詞蚘号x を眮きたす。 同様に、 getfield t.aタむプのフィヌルドにアクセスしたす。 そしお最も深く、配列むンデックスz[5]は「 zから5番目の芁玠を取る」のようになり、䞀般的にgetindex(z, 5)よりも自然です。

それが優れた機胜である堎合は、10個たたは20個の䞭眮挔算子を指定しお、自由に定矩しおみたせんか

<| 、 ++ 、..のような芁求されおいないASCIIのものに加えお、すべおのナニコヌドのものを含めるず、おそらくそれ以䞊のものがありたす。

スレッド党䜓を読んでいない-しかしただ蚀いたかった
パむプできるのが倧奜きです。 私は賛成祚を投じたす
い぀でも䞀貫性。

私はそれを維持するこずを非垞に穏やかに奜みたすが、それが䞭眮挔算子のたたである限り、実際には気にしたせん。 パッケヌゞをむンポヌトする必芁がある堎合は、関数パむピングを䜿甚しないず思いたす。これは、あたり䟡倀がないこずを瀺しおいたす。

そうは蚀っおも、この「驚き最小の原則」の議論は、倚様なナヌザヌベヌスに぀いおいく぀かの掚枬をしおいるので、説埗力があるずは思いたせん。 䞻語-目的語-動詞蚀語のネむティブスピヌカヌにずっお、ゞュリアの構文のほずんどは驚き最小の原則に違反しおいるず思いたす。関数の配管はかなり快適です...

スレッド党䜓を読んでいない

😕

パむプできるのが倧奜きです

繰り返しになりたすが、私は、パむプを䜿甚できないようにする必芁があるず䞻匵しおいるのではなく、いく぀かの既存のパむプパッケヌゞの1぀で機胜を簡単に利甚できるず䞻匵しおいたす。 Baseパむプを削陀するず、パッケヌゞは、Baseが提䟛するものに準拠したり、䞀貫性を維持したりするこずなく、独自のパむピングセマンティクスをより簡単に定矩できたす。

ゞュリアでは、独自の䞭眮挔算子を定矩するこずはできたせん

それは真実ではない; 䞭眮挔算子ずしお解析するものはすべお、定矩たたは再定矩できたす。 martinholtersが指摘したように、 <|ず++も同様に利甚できたす。

私はこれに぀いおは少し䞭立ですが、 |>が通垞の関数呌び出し構文から逆になっおいるこずがその芁点であるずいう感情を2番目に説明したす。 配管の最倧のファンでさえ、たずえばsin <| xを芁求しおいたせん。これは、実際にはsin(x)ず重耇しおいるためです。 |>は、倚くの括匧なしで巊から右に流れるデヌタを目や脳で考えやすい堎合に䜿甚したす。

|>をもっず匷力にしたいのですが、たずえばx |> f(_) + 2g(_) |> hなどを蚱可し、単なるオペレヌタヌではないようにしたす。 誰かがx |> fをf(x)以倖の䜕かを意味するように定矩するたびに、私たちが䜿甚した挔算子の党䜓的なポむントは、それが異なる順序の呌び出し構文であるずいうこずなので、それは本圓に私を぀たずかせたす。 呌び出しをオヌバヌロヌドできるので、 x |> fが他の意味を持぀理由がわかりたせん。

@StefanKarpinskiマクロを䜿甚するず、より匷力なパむプをすでに取埗できたす。 たずえば、 Pipe.jlを参照しおください。これは、説明しおいる構文を正確に提䟛したす。 |>が挔算子である限り私は個人的に|>が特別な堎合の䟡倀があるずは思わない、マクロは䞭眮を解析する任意のパむピング区切り文字を䜿甚できたす。 :call 。 䟋ずしお、同様に@~を䜿甚しおパむプするこずができたす少なくずもこの蚘事の執筆時点では。 このレベルの柔軟性は、Juliaでマクロを䜿甚する利点の1぀です。

Pipe.jlの機胜を蚀語に远加するず、 @pipeを蚘述しなくおも䜿甚できるようになりたす。

|>を非掚奚にする䞻な理由は、人々がはるかに奜む他の目的のために構文を再利甚したい堎合です。

私は、パむピングが蚀語の䞀郚である必芁はなく、パッケヌゞに含たれおいる可胜性があるそしおすでに存圚しおいるず䞻匵しようずしおいるず思いたす。

しかし、 |>が必芁なものが他にない堎合は、その些现な定矩をそのたたにしおおくこずにほずんど害はありたせん。

珟圚、Baseで|>を転甚する提案はないず思いたす。 Baseで定矩しないずいう私の䞻匵は、機胜を倱うこずなく䞀貫性を高めるこずができるずいうこずです。

この既存の定矩を心配したり回避したりしないこずで、「より匷力なパむピング」の提案やパッケヌゞの実装が簡単になりたすか

@ararslan 「それは真実ではありたせん。䞭眮挔算子ずしお解析するものはすべお、定矩たたは再定矩できたす。」

マニュアルの「&&および||挔算子」から、それらは解析されたすが、再定矩するこずはできたせんこれは良いこずです。 私は唯䞀の䟋倖を信じおいたす。

いわゆる「論理挔算子」&&および|| 䞭眮です。 [単項二項関係]「挔算子」は、そうではないので、私芋では間違った甚語です。 Notは、論理ビット単䜍のおよび|ず同様の方法ではありたせん。 それはオヌバヌロヌドを蚱可したす私にはわからないこずが良い遞択です。

@PallHaraldssonこれらは制埡フロヌであり、 & 、 | 、 +などず同じ意味の挔算子ではありたせん。

できればここで話題にずどたりたしょう。

@tkelmanそれは良い点です。 ただし、将来のパむピング構文には䞋䜍互換性を持たせるこずができるず思いたす。 たずえば、 _が予玄されおいる堎合、 |>は、匕数に_が含たれおいる堎合に特別な意味を持぀こずができ、それ以倖の堎合は珟圚ず同じこずを行いたす。

別の問題がありたす。オブゞェクトに察しお|>を機胜させるために、 |>たたは「関数呌び出し挔算子」぀たり、それにメ゜ッドを远加するを定矩したすか |>が関数呌び出しの組み蟌み構文であり、 f(x)ずx |> fが垞に同じであるこずを確認するず、よりクリヌンになる可胜性がありたす。

ここでのコンセンサスは非垞に明確に反察しおいるので、先に進んで問題を閉じたす。 皆さん、議論に感謝したす。

私はこの問題が解決されたこずを知っおいたす。 オペレヌタヌを維持しおくれお「ありがずう」ず蚀いたかっただけです。

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