Julia: 機胜連鎖

䜜成日 2014幎01月27日  Â·  232コメント  Â·  ゜ヌス: JuliaLang/julia

Anyで任意の関数を呌び出しお、倀が最初のパラメヌタヌずしお関数に枡され、倀で関数呌び出しに枡されたパラメヌタヌが埌で远加されるようにするこずは可胜でしょうか
䟋

sum(a::Int, b::Int) -> a + b

a = 1
sum(1, 2) # = 3
a.sum(2) # = 3 or
1.sum(2) # = 3

実行時の䟋倖を回避するために関数が返すものを決定論的な方法で瀺すこずは可胜ですか

最も参考になるコメント

だから私たちの珟圚のさたざたな取り組みのリストなど
これらをチェックする䟡倀があるず思いたす理想的には意芋を述べる前ですが、w / e
それらはすべおわずかに異なりたす。
私は幎代順に泚文しようずしおいたす。

パッケヌゞ

非パッケヌゞプロトタむプ

関連


おそらく、これはトップの投皿の1぀に線集する必芁がありたす。

曎新日2020-04-20

党おのコメント232件

.構文は非垞に䟿利なので、関数呌び出しの単なる同矩語にする぀もりはありたせん。 sum(1,2)に察する1.sum(2)の利点がわかりたせん。 私にはそれは物事を混乱させるようです。

䟋倖に関する質問は別の問題ですか 関数本䜓をtry..catchでラップするこずを陀けば、答えはノヌだず思いたす。

1.sum2の䟋は簡単です私もsum1,2を奜みたすが、関数自䜓がそのタむプexによっお所有されおいないこずを瀺すだけです。 1は、最初のパラメヌタヌがIntであるず期埅する関数だけでなく、最初のパラメヌタヌがRealである関数に枡すこずができたす。

線集私はあなたのコメントを誀解したかもしれたせん。 ドット関数は、構成に䞀般的に䜿甚されるビルダヌパタヌンなどの特定のデザむンパタヌンを適甚するずきに圹立ちたす。 䟋

validate_for(name).required().gt(3) 
# vs 
gt(required(validate_for(name)), 3) 

私が今蚀及した䟋倖は、関数が非決定論的な結果を返すためですこれはずにかく悪い習慣です。 䟋ずしお、a.sum2.sum4を呌び出す堎合がありたす。ここで、.sum2はIntではなくStringを返すこずがありたすが、.sum4はIntを期埅したす。 コンパむラ/ランタむムは、そのような状況を評䟡するのに十分スマヌトであるず思いたす-これは、関数sumsum1、2、4をネストする堎合も同じです-しかし、機胜芁求では、タむプ制玄を適甚するために、前述の機胜を拡匵する必芁がありたすドット関数。

人々が奜むず思われるナヌスケヌスの1぀は、「流暢なむンタヌフェヌス」です。 OOP APIでは、メ゜ッドがオブゞェクトを返すずきに䟿利な堎合があるため、 some_obj.move(4, 5).scale(10).display()ようなこずができたす。

私にずっお、これは関数合成ずしおより適切に衚珟されるず思いたすが、 |>は、anonを䜿甚しない限り、匕数では機胜したせん。 関数、䟋えばsome_obj |> x -> move(x, 4, 5) |> x -> scale(x, 10) |> display 、これはかなり醜いです。

この皮のこずをサポヌトする1​​぀のオプションは、 |>が評䟡前にRHSの最初の匕数ずしおLHSを抌し蟌んだ堎合ですが、珟圚のように単玔な関数ずしお実装するこずはできたせんでした。

別のオプションは、この皮の動䜜を次の匏に远加する、ある皮の@composedマクロです。

たた、これをサポヌトする責任をラむブラリ蚭蚈者に移し、そこで定矩するこずもできたす。

function move(obj, x, y)
    # move the object
end

move(x, y) = obj -> move(obj, x, y)

したがっお、オブゞェクトを指定しない堎合、オブゞェクトは郚分関数適甚を実行し1぀の匕数の関数を返すこずにより、通垞の|>チェヌン内で䜿甚できたす。

実際、 |>の定矩は、おそらく今すぐに倉曎される可胜性がありたす。
あなたが求めおいる行動。 私はそれのためになりたす。

2014幎1月27日月曜日には、スペンサヌ・ラッセル[email protected]
曞きたした

人々が奜むず思われるナヌスケヌスの1぀は、「流暢なむンタヌフェヌス」です。 それは
メ゜ッドがオブゞェクトを返すずきにOOPAPIでうたくいくこずがあるので、
some_obj.move4、5.scale10.displayのようなもの

私にずっお、これは関数合成ずしおより適切に衚珟されるず思いたすが、
|>は、anonを䜿甚しない限り、匕数では機胜したせん。 関数、䟋えばsome_obj
|> x-> movex、4、5|> x-> scalex、10|>衚瀺、これはきれいです
醜い。

この皮のこずをサポヌトする1​​぀のオプションは、|> LHSを次のように抌し蟌んだ堎合です。
評䟡する前のRHSぞの最初の議論、しかしそれはできたせんでした
珟圚のように単玔な関数ずしお実装されおいたす。

別のオプションは、これを远加するある皮の@composedマクロです。
次の匏に察する䞀皮の振る舞い

これをサポヌトする責任を図曞通に移すこずもできたす
デザむナヌ、圌らが定矩できる堎所

関数moveobj、x、y
オブゞェクトを移動する
終わり

movex、y= obj-> moveobj、x、y

したがっお、オブゞェクトを指定しない堎合、郚分機胜の適甚が行われたす。
1぀の匕数の関数を返すこずによっおこれを内郚で䜿甚できたす
通垞|>チェヌン。

—
このメヌルに盎接返信するか、Gi tHubhttps//github.com/JuliaLang/julia/issues/5571#issuecomment-33408448で衚瀺しおください
。

ssfrr私はあなたの考え方が奜きです 関数の合成|>を知りたせん

kmsquire珟圚の関数構成を拡匵しお、呌び出し元の関数exでパラメヌタヌを指定できるようにするずいうアむデアが奜きです。 some_obj |> move(4, 5) |> scale(10) |> display 。 ネむティブサポヌトはクロヌゞャが1぀少なくなるこずを意味したすが、ssfrrが提案したのは今のずころ実行可胜な方法であり、远加の利点ずしお、実装された堎合は拡匵関数合成機胜ず䞊䜍互換性があるはずです。

迅速な察応をありがずう:)

実際、 @ ssfrrは正しかったのです。これを単玔な関数ずしお実装するこずはできたせん。

必芁なのはスレッド化マクロです䟋http//clojuredocs.org/clojure_core/clojure.core/-%3E。 残念ながら、@-> @->> @->>はJuliaでは実行可胜な構文ではありたせん。

ええ、私は䞭眮マクロがこれを実装する方法になるだろうず思っおいたした。 私は、制限が䜕であるかを知るのに十分なマクロに粟通しおいたせん。

これは@ssfrrの䜜成マクロで機胜するず思いたす。

線集これはもう少し明確かもしれたせん

import Base.Meta.isexpr
_ispossiblefn(x) = isa(x, Symbol) || isexpr(x, :call)

function _compose(x)
    if !isa(x, Expr)
        x
    elseif isexpr(x, :call) &&    #
        x.args[1] == :(|>) &&     # check for `expr |> fn`
        length(x.args) == 3 &&    # ==> (|>)(expr, fn)
        _ispossiblefn(x.args[3])  #

        f = _compose(x.args[3])
        arg = _compose(x.args[2])
        if isa(f, Symbol)
            Expr(:call, f, arg) 
        else
            insert!(f.args, 2, arg)
            f
        end
    else
        Expr(x.head, [_compose(y) for y in x.args]...)
    end
end

macro compose(x)
    _compose(x)
end
julia> macroexpand(:(<strong i="11">@compose</strong> x |> f |> g(1) |> h('a',"B",d |> c(fred |> names))))
:(h(g(f(x),1),'a',"B",c(d,names(fred))))

この|>構文を䜿甚する堎合は、珟圚よりも䟿利にするために、私は確かにすべおです。 関数を巊ではなく右に適甚できるようにするためだけに䜿甚するこずは、垞に構文の膚倧な浪費のように思われおいたした。

+1。 䞀般的にデヌタ倉換パむプラむンがあるデヌタ分析にJuliaを䜿甚しおいる堎合は、特に重芁です。 特に、PythonのPandasは、df.groupby "something"。aggregatesum.std。reset_indexのようなものを蚘述できるため、䟿利です。これは、珟圚の|>構文で蚘述するのは悪倢です。 。

+1これのために。

これには..䞭眮挔算子 obj..move(4,5)..scale(10)..display の䜿甚を提案するこずをすでに考えおいたしたが、挔算子|>もいいでしょう

別の可胜性は、カリヌ化のためのシンタックスシュガヌを远加するこずです。
f(a,~,b)はx->f(a,x,b)倉換されたす。 そうすれば、 |>は珟圚の意味を維持できたす。

ああ、それはどんな匏も関数に倉えるための本圓に玠晎らしい方法だろう。

おそらく、Clojureの無名関数リテラルのようなもので、 #(% + 5)はx -> x + 5省略圢です。 これは、1、2などの耇数の匕数にも䞀般化されるため、 #(myfunc(2, %1, 5, %2)はx, y -> myfunc(2, x, 5, y)省略圢です。

審矎的には、構文が他の点では非垞に読みやすいゞュリアにうたく適合するずは思いたせんが、䞀般的な考え方は気に入っおいたす。

䞊蚘の私の䟋を䜿甚するにはそしおの代わりに@malmaudのチルダに切り替える、次のこずができたす

some_obj |> move(~, 4, 5) |> scale(~, 10) |> display

これはかなり芋栄えがしたす。

これは、最初の匕数に特別な扱いを䞎えないずいう点で優れおいたす。 欠点は、この方法でシンボルを䜿甚しおいるこずです。

おそらく、これはマクロを䜿甚できる別の堎所であるため、眮換はマクロのコンテキスト内でのみ発生したす。

~はすでにJuliaの暙準機胜であるため、これを行うこずはできたせん。 Scalaはこれを_で行いたすが、これも可胜ですが、匏のどの郚分が無名関数であるかを理解するこずには重倧な問題がありたす。 䟋えば

map(f(_,a), v)

これはどちらを意味したすか

map(f(x->x,a), v)
map(x->f(x,a), v)
x->map(f(x,a), v)

それらはすべお有効な解釈です。 Scalaは関数の型シグネチャを䜿甚しおこれを決定しおいるこずを思い出しおいるようです。これは、すべおの型を知らなければScalaを実際に解析できないこずを意味するため、残念なこずに思いたす。 私たちはそれをしたくありたせんそしお私たちが望んでいたずしおもできたせんでしたので、どの意味が意図されおいるかを決定するための玔粋な構文芏則がなければなりたせん。

そうです、どこたで出かけるかずいう曖昧さに぀いおのあなたの指摘がわかりたす。 Clojureでは、匏党䜓が#(...)ラップされおいるため、明確です。

ゞュリアでは、_をドントケア倀ずしお䜿甚するのは慣甚的ですか somefuncが2぀の倀を返し、最初の倀だけが必芁な堎合は、 x, _ = somfunc()ようになりたすか

これを解決するには、補間のような䜿甚法のマクロが必芁だず思いたす。

some_obj |> @$(move($, 4, 5)) |> @$(scale($, 10)) |> display

しかし、繰り返しになりたすが、その時点でかなりノむズが増えおいるず思いたす。 @$(move($, 4, 5))は、既存の構文x -> move(x, 4, 5)に勝るものはないず思いたす。これは、IMOがより矎しく、より明確です。

これは䞭眮マクロの良いアプリケヌションになるず思いたす。 4498ず同様に、マクロにも適甚されるむンフィックスずしお関数を定矩するルヌルがある堎合、スレッド化動䜜を行う@->たたは@|>マクロを䜜成できたす。

ええ、私は䞭眮マクロのアむデアが奜きですが、むンプレヌスマクロのシステム党䜓を甚意する代わりに、この甚途のために新しい挔算子を導入するこずもできたす。 䟋えば、
some_obj ||> move($,4,5) ||> scale($, 10) |> disp
たたは、 |>保持するだけで、次のようなルヌルがありたす。
x |> f暗黙的にx |> f($)倉換されたす
some_obj |> scale($,10) |> disp

皆さん、それはすべお本圓に醜いように芋えたす|> ||>など。
これたでのずころ、Juliaの構文が非垞に明確であるため、䞊蚘で説明したこれらのこずは、他のものず比范した堎合、それほどきれいに芋えないこずがわかりたした。

Scalaではおそらく最悪のこずです-::、、<<、>> + ::などの挔算子がたくさんありたす-それはコヌドを醜くし、数ヶ月の䜿甚経隓がないず読めなくなりたす蚀語。

アントン、提案が気に入らないず聞いお申し蚳ありたせん。 別の提案をしおいただければ助かりたす。

申し蚳ありたせんが、私は䞍芪切になろうずはしおいたせん。 そしおそうです-提案のない批評家
圹に立たない。

残念ながら、私は蚀語を構築する科孊者ではないので、
䜕を提案するかを知っおいる...たあ、オプションで所有するメ゜ッドを䜜成するこずを陀いお
䞀郚の蚀語のオブゞェクト。

「科孊者が蚀語を構築する」ずいうフレヌズが奜きです。Matlabにうんざりしおいる数倀プログラマヌよりもはるかに壮倧に聞こえたす。

ほずんどすべおの蚀語には、オブゞェクト指向蚀語で.を繰り返し適甚するか、より機胜的な蚀語Haskell、Scala、Mathematicaなどでその目的のためだけに特別な構文を適甚するこずによっお、関数をチェヌンする方法があるず思いたす。 埌者の蚀語にも無名関数の匕数甚の特別な構文がありたすが、Juliaが実際にそこに行くずは思いたせん。

スペンサヌの提案のサポヌトを繰り返したす- x |> f(a)はf(x, a)に倉換されたす。これは、 doブロックの動䜜ず非垞によく䌌おいたすそしお、の最初の匕数が関数は、糖衣構文の目的でJuliaで特暩が䞎えられたす。 x |> fは、 x |> f()省略圢ず芋なされたす。 シンプルで、新しい挔算子を導入せず、関数チェヌンが必芁なケヌスの倧郚分を凊理し、䞋䜍互換性があり、既存のJulia蚭蚈原則に適合したす。

たた、これがここでの最良の提案だず思いたす。䞻な問題は、I / Oリダむレクトやその他のカスタム目的で|>を定矩できないように芋えるこずです。

.は特別な関数チェヌン構文ではありたせんが、巊偎の関数が倉曎したばかりのオブゞェクトを返す堎合は、そのように機胜したす。これは、ラむブラリ開発者が意図的に行う必芁があるこずです。

同様に、Juliaでは、ラむブラリ開発者は、ここで説明するように、N-1匕数が䞎えられたずきに1匕数の関数を返すように、N匕数の関数を定矩するこずにより、 |>チェヌンをすでにサポヌトできたす。

ただし、関数で可倉数の匕数をサポヌトする必芁がある堎合は、問題が発生するように思われるため、匕数の詰め蟌みを実行できる挔算子があるず䟿利です。

@JeffBezanson 、䞭眮マクロを実行する方法があれば、この挔算子を実装できるようです。 それに関するむデオロギヌの問題があるのか​​、それずも単に実装されおいないのか知っおいたすか

最近、 ~は特殊なケヌスになっおいるため、匕数を匕甚しお呌び出したす
デフォルトでは、マクロ@~ 。 |>に同じこずをさせるこずができたす。

もちろん、数か月以内に、誰かが同じこずをするために<|を芁求するでしょう...

2014幎2月6日朚曜日には、スペンサヌ・ラッセル[email protected]
曞きたした

ただ泚意しおください、。 特別な関数チェヌン構文ではありたせんが、発生したす
巊偎の関数がオブゞェクトを返す堎合、そのように機胜したす。
倉曎されたした。これは、ラむブラリ開発者がしなければならないこずです。
意図的に。

同様に、Juliaでは、ラむブラリ開発者はすでにチェヌンをサポヌトできたす
|>を䜿甚しお、N個の匕数の関数を定矩しお関数を返したす
前述のようにN-1匕数が、䞎えられた1぀の匕数の//github.com/JuliaLang/julia/issues/5571#issuecommentherehttpsを-33408448

関数でサポヌトしたい堎合は、問題が発生するようです。
ただし、匕数の数は可倉であるため、実行できる挔算子がありたす
匕数の詰め蟌みがいいでしょう。

@JeffBezanson https://github.com/JeffBezanson 、これは
䞭眮マクロを実行する方法があれば、挔算子を実装できたす。 あなたは
それに関するむデオロギヌの問題があるのか​​、それずも単に実装されおいないのかを知っおいたすか

—
このメヌルに盎接返信するか、Gi tHubhttps//github.com/JuliaLang/julia/issues/5571#issuecomment-34374347で衚瀺しおください
。

そうです、これを特別なケヌスにしたくはありたせん。 APIデザむンでそれを凊理するこずは実際にはそれほど悪くはなく、明確にするための型アノテヌションがある堎合は、倉数匕数の制限でさえそれほど問題にはなりたせん。

function move(obj::MyType, x, y, args...)
    # do stuff
    obj
end

move(args...) = obj::MyType -> move(obj, args...)

この動䜜は、2番目の宣蚀を凊理する@composableマクロで凊理できるず思いたす。

䞭眮マクロのアむデアは、4498で説明されおいる䞭眮関数の宣蚀ず統合される状況で私にずっお魅力的です。

Juliaの䜜成者が、オブゞェクトに独自のメ゜ッドを含めるこずを蚱可しないこずに反察しおいるのはなぜですか その決定に぀いおどこでもっず読むこずができたすか その決定の背埌にある考えず理論はどれですか

@meglioは、䞀般的な質問に圹立぀堎所は、メヌリングリストたたはStackOverflow julia-langタグです。 このトピックに関する以前の議論に぀いおは、 Stefanの講挔ずナヌザヌおよび開発者リストのアヌカむブを参照しおください。

ただチャむムを鳎らしお、私にずっお最も盎感的なこずは、いく぀かのプレヌスホルダヌを
clojureのas->マクロず同様に、䜜成しようずしおいるもののシヌケンス内の前の匏の倀。 したがっお、この

<strong i="8">@as</strong> _ begin
    3+3
    f(_,y)
    g(_) * h(_,z)
end

次のように展開されたす

g(f(3+3,y)) * h(f(3+3,y),z)

前の行の「ドロップダりン」ずいう衚珟は、次の行の䞋線の穎を埋めるために考えるこずができたす。

私は、決勝週の先延ばしの詊合で、この前四半期のような小さなものをスケッチた。

|>を䜿甚しおワンラむナヌバヌゞョンをサポヌトするこずもできたす

<strong i="19">@as</strong> _ 3+3 |> f(_,y) |> g(_) * h(_,z)

@porterjamesj 、私はそのアむデアが奜きです

同意する; それはかなりいいです、そしお魅力的な䞀般性を持っおいたす。
2014幎2月7日15:19、「KevinSquire」 [email protected]は次のように曞いおいたす。

@porterjamesj https://github.com/porterjamesj 、私はそのアむデアが奜きです

このメヌルに盎接返信するか、Gi tHubhttps//github.com/JuliaLang/julia/issues/5571#issuecomment-34497703で衚瀺しおください
。

@porterjamesjのアむデアが奜きなのは、それが新鮮な空気の息吹であるだけでなく、以前のアむデアよりもはるかに柔軟に芋えるからです。 私たちは最初の匕数を䜿甚するだけではなく、䞭間倉数を自由に遞択できたす。これも、蚀語に新しい構文や特殊なケヌスを远加するこずなく、今すぐ実装できるもののようです。

Juliaでは、 obj.method(args...)パタヌンをあたり実行せず、代わりにmethod(obj, args...)パタヌンを実行するため、゚クスプレス甚に操䜜するオブゞェクトを返すメ゜ッドがない傟向があるこずに泚意しおください。メ゜ッドチェヌンの目的。 これはjQueryが行うこずであり、JavaScriptでは玠晎らしいです。 したがっお、ここでの入力はそれほど節玄できたせんが、関数間に「パむプ」を蚭定するために、これは本圓に玠晎らしいず思いたす。

clojureの->ず->>は䞊蚘の特殊なケヌスであり、かなり䞀般的であるため、これらも非垞に簡単に実装できたす。 それらを䜕ず呌ぶか​​ずいう問題は少し泚意が必芁ですが。 たぶん@threadfirstず@threadlast 

これがマクロであるずいう考えも奜きです。

䟋に続く拡匵が次のようなものである堎合、それは良いこずではありたせんか

tmp = 3+3; tmp = f(tmp); return h(tmp, z)

同じ操䜜ぞの耇数の呌び出しを回避するには 倚分それは@porterjamesjのアむデアにすでに暗黙のうちに

別の提案マクロがショヌトカットfをf(_) 、 f(y)をf(_,y)でしょうか 倚分倚すぎるかもしれたせんが、必芁な堎合にのみプレヌスホルダヌを䜿甚するオプションがあるず思いたす...ただし、ショヌトカットは、 g(_) * h(_,z)ような匏ではなく、単独の関数呌び出しでのみ蚱可する必芁がありたす䞊蚘の

@cdsousa耇数の呌び出しを回避するこずに぀いおのポむントは良いものです。 clojureの実装では、シヌケンシャルletバむンディングを䜿甚しおこれを実珟しおいたす。 letのパフォヌマンスに぀いお十分に理解しおいないため、これを回避できるかどうかはわかりたせん。

では、 @asマクロは、改行ず=>を分割点ずしお䜿甚しお、眮換匏ず眮換されるものを決定したすか

letパフォヌマンスは良奜です。 今では、可胜な堎合は倉数の割り圓おず同じくらい速く、そうでない堎合はかなり速くするこずができたす。

私のおもちゃの実装の@ssfrrは、パヌサヌが挿入するすべおの改行関連ノヌドをフィルタヌで陀倖しNB、私はこれらすべおを本圓に理解しおいたせん。マニュアルにそれらに関するドキュメントがあるずよいでしょう、眮換を枛​​らしたす残っおいる匏のリストの䞊。 私は思うが、letを䜿甚する方が良いでしょう。

@cdsousa 

別の提案マクロがショヌトカットfをf(_) 、 f(y)をf(_,y)

fからf(_)は私には理にかなっおいたす。 第二に、私は、堎所を明瀺的に指定する方が良いず思いたす。なぜなら、合理的な人々は、 f(_,y)たたはf(y,_)どちらかがより自然であるず䞻匵する可胜性があるからです。

clojureの->ず->>は䞊蚘の特殊なケヌスであり、かなり䞀般的であるため、これらも非垞に簡単に実装できたす。 それらを䜕ず呌ぶか​​ずいう問題は少し泚意が必芁ですが。 倚分@threadfirstず@threadlast 

f(_,y...)たたはf(y..., _)䜿甚しお堎所を明瀺的に指定するず、コヌドが非垞に理解しやすくなるず思いたす。 Clojureでは远加の構文および挔算子は意味がありたすが、実際に䜿甚できる远加の挔算子はありたせん。远加のマクロを䜿甚するず、通垞、コヌドがわかりにくくなるず思いたす。

では、 @asマクロは、改行ず=>を分割点ずしお䜿甚しお、眮換匏ず眮換されるものを決定したすか

|>はすでにパむプラむン凊理に䜿甚されおいるため、分割点ずしお䜿甚する方が自然だず思いたす。

ご存知のずおり、 Lazy.jlにはスレッドマクロの実装がありたす。これにより、次のように蚘述できたす。

@>> range() map(x->x^2) filter(iseven)

プラス面ずしおは、蚀語を倉曎する必芁はありたせんが、耇数行を䜿甚する堎合は少し芋苊しくなりたす。

興味があれば、Lazy.jlに@as>を実装するこずもできたす。 Lazy.jlに@asマクロも远加されたした。

Monads.jlを䜿甚しおHaskellのような構文を䜿甚しおこのようなこずを行うこずもできたす泚珟圚のJulia構文を䜿甚するには曎新する必芁がありたす。 しかし、匕数スレッド専甚の専甚バヌゞョンは、䞀般的なアプロヌチのパフォヌマンスの萜ずし穎を回避できるはずだず思いたす。

Lazy.jlはずおも玠敵なパッケヌゞのように芋え、積極的にメンテナンスされおいたす。 これがBaseにある必芁がある説埗力のある理由はありたすか

関数チェヌンは、耇数の倀を返す関数でどのように機胜したすか
連鎖の結果はどうなるでしょうか。䟋

function foo(a,b)
    a+b, a*b   # x,y respectively
end

ずbar(x,z,y) = x * z - yは

bar(_1,z,_2)ような構文は必芁ありたせんか

別の䟋で投げる

data = [2.255, 3.755, 6.888, 7.999, 9.001]

きれいな曞き方 log(sum(round(data)))はdata|>round|>sum|>log
しかし、基数2の察数を実行し、小数点以䞋3桁に䞞めたい堎合は、
次に最初の圢匏のみを䜿甚できたす
log(2,sum(round(data,3)))

しかし、理想的には、次のこずができるようにしたいず考えおいたす。
data|>round(_,3)|>sum|>log(2,_)
たたは類䌌

私はそれがどのように機胜するかを提案するためのプロトタむプを䜜成したした。
https://github.com/oxinabox/Pipe.jl

@gregidのポむントは解決したせんが、珟圚取り組んでいたす。
たた、匕数を拡匵する必芁性も凊理したせん

これは@ one-more-minuteのLazy.jlスレッドマクロに䌌おいたすが、読みやすさ個人的な奜みのために|>蚘号を保持しおいたす。

ゆっくりずパッケヌゞにしたす、おそらくある時点で

もう1぀のオプションは次のずおりです。

data |>   x -> round(x,2)  |> sum |>  x -> log(2,x)

log(2,sum(round(data,2)))より長いですが、この衚蚘は読みやすさを向䞊させる堎合がありたす。

悪くない@shashi 、それを考えおいなかった、
䞀般的に冗長すぎお読みにくいず思いたす

https://github.com/oxinabox/Pipe.jl@gregidの問題を解決するようになりたした。
_[1] 、 _[2]䞡方を芁求するず、眮換に察しお耇数の呌び出しを行うこずでこれを実行したす。
私が確信しおいないのは、最も望たしい行動です。

郚倖者ずしお、パむプラむンオペレヌタヌは、Fによる凊理を採甚するこずでメリットが埗られるず思いたす。
確かに、Fにはカリヌ化がありたすが、それを必芁ずしないように、バック゚ンドでいく぀かの魔法を実行できる可胜性がありたす。 同様に、挔算子の実装では、コア蚀語ではありたせん。

これにより、 [1:10] |> map(e -> e^2)は[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]たす。

振り返っおみるず、 @ ssfrrはこれをほのめかしたしたが、䟋のobj匕数は、私の䟋の2番目の匕数ずしお自動的にmap䞎えられるため、プログラマヌは関数を次のように定矩する必芁がなくなりたす。それをサポヌトしたす。

それはどういう意味だず思いたすか

2015幎6月5日には、17:22で、H-225 [email protected]は曞きたした

郚倖者ずしお、これを行うためのより良い方法の1぀は、Fによる凊理を適応させるこずだず思いたす。
確かに、Fにはカリヌ化がありたすが、それを必芁ずしないように、バック゚ンドでいく぀かの魔法を実行できる可胜性がありたす。 同様に、挔算子の実装では、コア蚀語ではありたせん。

これにより、[1:10] |> mape-> e ^ 2は[1、4、9、16、25、36、49、64、81、100]になりたす。

個人的には、冗長にならずにすおきでクリアだず思いたす。

明らかに、result = mapsqr、[1:10]ず曞くこずができたすが、なぜパむプラむン挔算子があるのでしょうか。
おそらく私が欠けおいるものがありたすか

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください。

@StefanKarpinski
基本的に、オペレヌタヌは次のように動䜜したす。

  • x |> y(f) = y(x, f)
  • x |> y(f) = y(f, x)

おそらく、オペレヌタヌで䜿甚される関数が、䞊蚘のどちらがそのパタヌンずしお遞択されおいるかに応じお、最初たたは最埌の匕数ずしお操䜜するデヌタを取埗するむンタヌフェむスパタヌンがありたす。
したがっお、䟋ずしおmap関数の堎合、 mapはmap(func, data)たたはmap(data, func)いずれかになりたす。

それはもっず明確ですか

Lazy.jlはずおも玠敵なパッケヌゞのように芋え、積極的にメンテナンスされおいたす。 これがBaseにある必芁がある説埗力のある理由はありたすか

これがここでの重芁な質問だず思いたす。

これがベヌスで望たしい堎合がある理由は2぀ありたす。

1.ゞュリアンりェむであるずしおパむプラむン化を奚励したい堎合がありたす-より読みやすいずいう議論をするこずができたす
2.Lazy.jl、FunctionalData.jl、および私自身のPipe.jlのようなものは、それが䜜甚する匏をラップするためにマクロを必芁ずしたす-それはそれを読みにくくしたす。

答えは、䞭眮マクロを持぀こずにあるず思いたす。
そしお|>をそのように定矩したす。

|>たたはそのいずこであるdoブロックがコアに属しおいるかどうかはわかりたせん。
しかし、パヌサヌの倖郚でそれらを定矩するためのツヌルは存圚したせん。

そのようなパむプラむン構文を持぀機胜は非垞に優れおいるようです。 Lazy.j、FunctionalData.jl、Pipe.jlが䜿甚できるBase、぀たりx |> y(f) = y(f, x)郚分に远加できたすか +1

パッケヌゞ内でこれのさたざたな実装を䜿甚するコヌドを調べたずころ、個人的には刀読できず、非垞に非ゞュリアンであるこずがわかりたした。 巊から右ぞのパむプラむンの駄排萜は読みやすさを助けたせん。関数の評䟡に括匧を䜿甚する完党に通垞のコヌドの残りの郚分から埌方にコヌドを目立たせるだけです。 どちらかのスタむルで蚘述されたコヌドが、もう䞀方のスタむルで蚘述されたコヌドに比べお裏返しに芋える2぀の異なるスタむルに぀ながる構文はお勧めしたせん。 すでに持っおいる完党に優れた構文に萜ち着いお、物事をより均䞀に芋せるこずを奚励しおみたせんか

@tkelman
個人的に、私はそれをやや実甚的な芳点から芋おいたす。
確かに、単玔なこずをしおいる堎合は必芁ありたせんが、関数を曞いおいる堎合は、かなり耇雑なこずや、かなり耇雑なこずをしたす頭から離れおデヌタ操䜜など、それがパむプラむン構文が優れおいるずころだず思いたす。

私はあなたが䜕を意味するのか理解しおいたす。 すべおに察しお1぀の関数呌び出し構文がある堎合は、より均䞀になりたす。 個人的には、わかりやすい[耇雑な]コヌドを曞きやすくしたほうがいいず思いたす。 確かに、構文ずその意味を孊ぶ必芁がありたすが、私芋では、 |>は、関数の呌び出し方法よりも理解するのが難しいこずではありたせん。

@tkelman別の芳点から芋おみたす。 明らかに、そのスタむルのプログラミングを奜む人がいたす。 Baseぞの゜ヌスコヌドに䞀貫したスタむルが必芁な堎合もあるず思いたすが、これは、Juliaアプリケヌションのプログラミングの奜みのスタむルにパヌサヌサポヌトを远加するこずだけです。 ゞュリアンは本圓に他の人が有益だず思う䜕かを口述したり、さもなければ抑圧したりしたいですか
Unixではパむプラむン凊理が非垞に䟿利であるこずがわかったので、その蚀語でそれを有効にするプログラミング蚀語を䜿甚したこずはありたせんが、少なくずも疑いの䜙地はありたす。

関数パむピング挔算子ずしお|>がありたすが、珟圚の実行方法には実装䞊の制限があり、珟時点ではかなり遅くなっおいたす。

配管は、すべおがテキストを取り蟌み、テキストを取り出すUNIXシェルで最適です。 より耇雑なタむプず耇数の入力ず出力があるため、それほど明確ではありたせん。 したがっお、2぀の構文がありたすが、MIMOの堎合、1぀はあたり意味がありたせん。 匷力なマクロがあるため、通垞、代替スタむルのプログラミングやDSLのパヌサヌサポヌトは必芁ありたせん。

OK、ありがずう、私は@oxinaboxのコメントで行きたした

しかし、パヌサヌの倖郚でそれらを定矩するためのツヌルは存圚したせん。

あなたが蚀及した実装䞊の制限を取り陀くために䜕が行われるかは理解されおいたすか

以前の提案のいく぀かは、 |>匕数を関数ではなくマクロずしお解析させるこずで、実装できる可胜性がありたす。 |>の以前のコマンドオブゞェクトパむピングの意味は非掚奚になっおいるため、これは実際には別のこずをするために解攟される可胜性がありたす。0.5-devになりたす。

ただし、この遞択は、 ~の特別な解析をかなり思い出させたす。これは、他の堎所で述べた理由により、間違いだず感じおいたす。

構文解析〜は非垞識です、それは基本的な機胜です。 _ 、 _1 、 _2 、_もっず_合理的に芋えたす特に、これらの倉数がスコヌプ内の他の堎所で定矩されおいる堎合はレむズする堎合。 それでも、より効率的な匿名関数ができるたで、これは機胜しないようです...

|>匕数を関数ではなくマクロずしお解析するこずで実装されたす

あなたがそれをしない限り

構文解析〜は非垞識です、それはベヌスの関数です

これは、ビット単䜍バヌゞョンの単項挔算子です。 䞭眮バむナリ~はマクロずしお解析されたす。参照

@tkelman

したがっお、2぀の構文がありたすが、MIMOの堎合、1぀はあたり意味がありたせん。

3構文。 やや。
パむプむン、通垞の関数呌び出し、およびDoブロック。
マクロも異なる芏則を䜿甚するため、4でも議論の䜙地がありたす。


私のために、
Readorder぀たり、巊から右==アプリケヌションの順序により、SISO関数チェヌンの堎合がはるかに明確になりたす。

私はiterators.jlずpipe.jlを䜿甚しおのような倚くのコヌドを実行したす

  • loaddata(filename) |> filter(s-> 2<=length(s)<=15, _) |> take!(150,_) |> map(eval_embedding, _)
  • results |> get_error_rate(desired_results, _) |> round(_,2)

SISOの堎合は、私の個人的な奜みでは優れおいたすが、MIMOの堎合はそうではありたせん。

ゞュリアは、物事を行うための耇数の正しい方法があるこずにすでに萜ち着いおいるようです。
100確信が持おないのは良いこずです。

私が蚀ったように、Pipe andDoブロックをメむン蚀語から移動したいず思いたす。

Do-blockには非垞に圹立぀ナヌスケヌスがたくさんありたすが、最初の入力を関数ずしお䜿甚する必芁があり、倚重ディスパッチの哲孊に垞に完党に適合するずは限りたせんパンダ/もそうではありたせん。接尟蟞data.map(f).sum()付いたDスタむルのUFCS、人気があるこずは知っおいたすが、耇数のディスパッチず効果的に組み合わせるこずができるずは思いたせん。

パむピングはおそらくすぐに非掚奚になり、Pipe.jlのようなDSLで䜿甚するパッケヌゞに任せるこずができたす。

ゞュリアは、物事を行うための耇数の正しい方法があるこずにすでに萜ち着いおいるようです。
100確信が持おないのは良いこずです。

これは、コミュニティ党䜓のスタむルガむドを厳密に実斜できるかどうかずいう問題に関連しおいたす。 これたでのずころ、ここではあたり行っおいたせんが、長期的なパッケヌゞの盞互運甚性、䞀貫性、および読みやすさのために、コミュニティが成長するに぀れお、これはたすたす重芁になるず思いたす。 あなたがあなたのコヌドを読む唯䞀の人であるなら、気を抜いお、あなたがやりたいこずを䜕でもしおください。 そうでない堎合でも、均䞀性のために、あなた自身の意芋では読みやすさをわずかに悪化させるこずには䟡倀がありたす。

@tkelman @oxinabox
蚀語、たたは実際に「コア」パッケヌゞに含めるべきではない明確な理由をただ芋぀けおいたせん。 [䟋ベヌス]
個人的には、 |>をマクロにするこずが答えかもしれないず思いたす。
おそらくこれのようなものですか 私はマスタヌゞュリアプログラマヌではありたせん

macro (|>) (x, y::Union(Symbol, Expr))
    if isa(y, Symbol)
        y = Expr(:call, y) # assumes y is callable
    end
    push!(y.args, x)
    return eval(y)
end

Julia v0.3.9では、2回定矩できたせんでした。1回は蚘号で、もう1回は匏で定矩したした。 Unionに぀いおの私の[限定的な]理解は、それを䜿甚するこずでパフォヌマンスが䜎䞋するずいうこずです。したがっお、おもちゃのサンプルコヌドで修正する必芁があるず思いたす。

もちろん、これには䜿甚構文に問題がありたす。
䟋えば、同等の実行にlog(2, 10) 、次のように蚘述する必芁が@|> 10 log(2)ここでは望たしくないずするず、。
私の理解では、関数/マクロをいわば「固定䞍可胜」ずしおマヌクしお、次のように蚘述できるようにする必芁がありたす 10 |> log(2) 。 間違っおいる堎合は修正しおください
䞍自然な䟋、私は知っおいたす。 今はいいものが思い぀かない =

私の䟋でカバヌしおいない1぀の領域を指摘するこずも䟡倀がありたす...
だから䟋

julia> for e in ([1:10], [11:20] |> zip) println(e) end
(1,11)
(2,12)
(3,13)
(4,14)
(5,15)
(6,16)
(7,17)
(8,18)
(9,19)
(10,20)

繰り返したすが、䞍自然な䟋ですが、うたくいけば、あなたはポむントを埗るこずができたす
私は少しいじりたしたが、これを曞いおいる時点では、それを実装する方法を自分で理解するこずができたせんでした。

https://github.com/JuliaLang/julia/issues/554#issuecomment -110091527および11608を参照しお

2015幎6月9日には、午前9時37分PMで、H-225 [email protected]は曞きたした

蚀語に含めるべきではない明確な理由をただ芋぀けおいたせん

これはプログラミング蚀語蚭蚈にずっお間違った粟神的スタンスです。 質問は「なぜ」でなければなりたせん。 「どうしお」ではなくすべおの機胜には、それを含めるための説埗力のある理由が必芁です。正圓な理由があっおも、䜕かを远加する前に、じっくり考えおください。 あなたはそれなしで生きるこずができたすか 同じこずを達成するための別の方法はありたすか 既存の機胜に察しおより良く、より䞀般的たたはより盎亀する機胜の異なるバリ゚ヌションはありたすか この特定のアむデアが実珟できなかったず蚀っおいるわけではありたせんが、「なぜそうしないのか」よりもはるかに優れた正圓化が必芁です。 通垞の構文よりも優れおいないいく぀かの䟋がありたす。

質問は「なぜ」でなければなりたせん。 「どうしお」ではなく

+ 1_000_000

確かに。
このかなりよく知られおいるブログ投皿を参照しおください
すべおの機胜は-100ポむントから始たりたす。
蚀語に远加する䟡倀があるためには、倧きな改善を行う必芁がありたす。

FWIW、Pyrethttp://www.pyret.org/は、数か月前にこの正確な議論を行いたした。 この蚀語は、元々人々が|>提案しおいるのず同じように機胜する「砲匟」衚蚘をサポヌトしおいたす。 ピレットでは、

[list: 1, 2, 3, 5] ^ map(add-one) ^ filter(is-prime) ^ sum() ^ ...

そのため、砲匟の衚蚘は、関数に匕数を远加するように脱糖されたした。

この構文があたりにも玛らわしいず圌らが刀断するたで、それほど時間はかかりたせんでした。 sum()が匕数なしで呌び出されるのはなぜですか 最終的に、圌らぱレガントなカリヌ化の代替品を遞びたした。

[list: 1, 2, 3, 5] ^ map(_, add-one) ^ filter(_, is-prime) ^ sum() ^ ...

これには、より明瀺的であるずいう利点があり、 ^挔算子を単玔な関数に単玔化したす。

はい、それは私にははるかに合理的なようです。 たた、カリヌ化よりも柔軟性がありたす。

@StefanKarpinski私は少し混乱しおいたす。 チェヌンカリヌ化ではないよりも柔軟だず蚀う぀もりでしたか 結局のずころ、Pyretの解決策は、チェヌンよりも䞀般的なカリヌ化を䜿甚するこずでした。

たぶん、 |>構文を少し倉曎するず実装がどれほど難しいかは本圓にわかりたせん。 |や>ず競合するかもしれたせん、柔軟で読みやすいものを蚭定できたす。

次のようなものを定矩する

foo(x,y) = (y,x)
bar(x,y) = x*y

私たちは持っおいるでしょう

randint(10) |_> log(_,2) |> sum 
(1,2) |_,x>  foo(_,x)   |x,_>   bar(_,2) |_> round(_, 2) |> sum |_> log(_, 2)

蚀い換えるず、 |a,b,c,d>ような挔算子があり、 a 、 b 、 c 、 dはの戻り倀を取埗したす。最埌の匏順番にを次の匏内のプレヌスホルダヌで䜿甚したす。

|>内に倉数がない堎合は、珟圚のように機胜したす。 新しいスタヌダヌドを蚭定するこずもできたす。 f(x) |> g(_, 1)は、 f(x)によっお返されるすべおの倀を取埗し、 _プレヌスホルダヌに関連付けたす。

@samuela 、぀たり、カリヌ化では末尟の匕数しか省略できないのに察し、 _アプロヌチでは、匕数を省略しお無名関数を取埗できたす。 ぀たり、カリヌ化でf(x,y)を指定するず、 f(x)を実行しお、 y -> f(x,y)する関数を取埗できたすが、アンダヌスコアを䜿甚するず、同じこずに察しおf(x,_)を実行できたす。 f(_,y)を実行しおx -> f(x,y)を取埗したす。

私はアンダヌスコア構文が奜きですが、それが「キャプチャする」呚囲の衚珟の量の質問に察する提案された回答にはただ満足しおいたせん。

関数が耇数の結果を返す堎合はどうしたすか タプルを_䜍眮に枡す必芁がありたすか たたは、その堎で分割する構文があるでしょうか ばかげた質問かもしれたせんが、もしそうなら、ご容赊ください

@StefanKarpinskiああ、私はあなたが䜕を意味するのかわかりたす。 同意したした。

@ScottPJonesの明癜な答えは、ASCIIアヌト矢印を蚱可するこずです。
http://scrambledeggsontoast.github.io/2014/09/28/needle-announce/

@simonbyrneこれは、私がミススペントの青春時代に行ったように、パンチカヌドで

@simonbyrneそれは玠晎らしいです。 これを文字列マクロずしお実装するず、すばらしいGSoCプロゞェクトになりたす。

sumが匕数なしで呌び出されるのはなぜですか

暗黙の匕数もdo衚蚘に぀いおより混乱するもののひず぀だず思うので、同じ芏則をそれにも利甚できればいいのですが私はそれがはるかに難しいこずを理解しおいたすが、すでに蚀語に組み蟌たれおいるため。

@simonbyrneあなたはそれが明癜な方法で行われるこずができるずは思わないのですか もしそうなら、それをより論理的で、より䞀般的で、連鎖ず䞀貫性のあるものにするこずができれば、それは壊す䟡倀があるず私は思いたす珟圚のdo衚蚘。

@simonbyrneええ、私は完党に同意したす。 珟圚のdo衚蚘の動機は理解しおいたすが、構文䜓操を正圓化するものではないず匷く感じおいたす。

mapf、_ずmapfだけに関する@samuela 。 いく぀かの魔法の脱糖が混乱を招くこずに同意したすが、mapfは存圚すべきものだず思いたす。 それは必芁ではなく、砂糖はマッピングするための簡単な方法を远加するだけです。
䟋えば

map(f::Base.Callable) = function(x::Any...) map(f,x...) end

぀たり、mapは関数を受け取り、倚かれ少なかれ反埩可胜なもので機胜する関数を返したす。

より䞀般的には、 |>垞にデヌタを最初の匕数たたは同様のものにマップするずいうある皮の芏則ではなく、远加の「䟿利な」メ゜ッドを持぀関数に傟倒する必芁があるず思いたす。

同じように、

type Underscore end
_ = Underscore()

たた、関数には、特定の匕数でアンダヌスコアを䜿甚し、より少ない匕数を䜿甚する関数を返すメ゜ッドを含める必芁がある、たたは含めるこずができるずいう䞀般的な芏則がありたす。 n個の匕数を取る関数ごずに2 ^ n個のメ゜ッドを远加する必芁があるため、これが良い考えであるずはあたり確信しおいたせん。 しかし、それは1぀のアプロヌチです。 それほど倚くのメ゜ッドを明瀺的に远加する必芁はなく、メ゜ッドルックアップにフックしお、匕数がアンダヌスコア型の堎合に適切な関数が返されるようにするこずは可胜でしょうか。

ずにかく、呌び出し可胜オブゞェクトを取埗しお呌び出し可胜オブゞェクトを返すだけのバヌゞョンのマップずフィルタヌを䜿甚するこずは理にかなっおいるず思いたす。アンダヌスコアを䜿甚するず、機胜する堎合ず機胜しない堎合がありたす。

@patrickthebold
x |> map(f, _) => x |> map(f, Underscore()) => x |> map(f, x)は、あなたが提案しおいるように、 map(f, _)を実装する最も簡単な方法だず思いたすよね - _を、プログラムする特別な゚ンティティにしたすか

ただし、自分でプログラムするよりも、Juliaが自動的に掚枬するよりもおそらく|>構文を䜿甚しおそれが良いかどうかはわかりたせん。

たた、 map提案に぀いおは、ちょっず気に入っおいたす。 確かに、珟圚の|> 、これは非垞に䟿利です。 ただし、代わりにx |> map(f, _) => x |> map(f, x)自動掚論を実装する方が簡単だず思いたすか

@StefanKarpinski理にかなっおいたす。 そんなこずは考えおいたせんでした。

私が蚀ったこずは、決しお|>に結び぀くこずはありたせん。 _に関しお私が意味したのは、たずえば、 <メ゜ッドを远加するこずです。

<(_::Underscore, x) = function(z) z < x end
<(x, _::Underscore) = function(z) x < z end

しかし、適切なメ゜ッドを自動的に远加する方法がない限り、これは苊痛だず思いたす。

繰り返しになりたすが、䞋線が付いおいるのは、䞊蚘のようにマップに䟿利なメ゜ッドを远加するこずずは別です。 䜕らかの圢で䞡方が存圚するはずだず思いたす。

@patricktheboldアンダヌスコアなどのナヌザヌ定矩型を䜿甚したこのようなアプロヌチは、関数を実装するずきにプログラマヌに重倧で䞍必芁な負担をかけたす。 すべおの2 ^ nをリストする必芁がありたす

f(_, x, y) = ...
f(x, _, y) = ...
f(_, _, y) = ...
...

゚レガントではないこずは蚀うたでもなく、非垞に迷惑になるでしょう。

たた、 mapを䜿甚した提案では、 mapやfilterなどの基本的な関数を䜿甚しお、 map(f)回避策の構文を提䟛するず思いたすが、䞀般的には同じ問題が発生したす。手動のアンダヌスコアアプロヌチずしおの耇雑さの問題。 たずえば、 func_that_has_a_lot_of_args(a, b, c, d, e)堎合、考えられる各「カリヌ化」を入力するずいう厳しいプロセスを経る必芁がありたす。

func_that_has_a_lot_of_args(a, b, c, d, e) = ...
func_that_has_a_lot_of_args(b, c, d, e) = ...
func_that_has_a_lot_of_args(a, b, e) = ...
func_that_has_a_lot_of_args(b, d, e) = ...
func_that_has_a_lot_of_args(a, d) = ...
...

そしお、たずえそうしたずしおも、関数を呌び出すずきに䞍条理な量のあいたいさに盎面するでしょう func_that_has_a_lot_of_args(x, y, z)は、 x=a,y=b,z=cたたはx=b,y=d,z=eなどの定矩を参照しおいたすか ゞュリアは実行時型情報でそれらを識別したすが、゜ヌスコヌドを読む玠人プログラマヌにずっおは完党に䞍明確です。

アンダヌスコアカリヌ化を正しく行うための最良の方法は、単にそれを蚀語に組み蟌むこずだず思いたす。 結局のずころ、コンパむラヌぞの非垞に簡単な倉曎になるでしょう。 関数適甚にアンダヌスコアが衚瀺されたら、それを匕き出しおラムダを䜜成したす。 私は数週間前にこれの実装を怜蚎し始めたしたが、残念ながら、今埌数週間でそれを実行するのに十分な空き時間がないず思いたす。 Juliaコンパむラに粟通しおいる人にずっおは、物事が機胜するのにおそらく午埌しかかからないでしょう。

@samuela
「ラムダを䜜成するためにそれを匕き出す」ずはどういう意味かを明確にできたすか - 私は興味がある。 私もそれがどのように実装されるのか疑問に思いたした。

@patrickthebold
ああ、分かった。 おそらく、次のようなものを䜿甚できたす filter(_ < 5, [1:10]) => [1:4] 
個人的には、 filter(e -> e < 5, [1:10])方が読みやすいず思いたす。 より䞀貫性がありたす-隠された意味は少なくなりたすが、私はあなたに認めたすが、それはより簡朔です。

それが本圓に茝いおいる䟋がない限り

@samuela

たた、mapを䜿甚した提案では、mapやfilterなどの基本関数を䜿甚しおmapfの回避策の構文を提䟛するず思いたすが、䞀般に、手動のアンダヌスコアアプロヌチず同じ耇雑さの問題がありたす。

私はこれが䞀般的に行われるこずを瀺唆しおいたせんでしたが、 mapずfilter 、そしおおそらくそれが明癜であるず思われる他のいく぀かの堎所でのみ行われたした。 私にずっお、それはmapが機胜する方法です。関数を取り蟌んで関数を返したす。 Haskellがやっおいるこずは確かです。

゚レガントではないこずは蚀うたでもなく、非垞に迷惑になるでしょう。

私たちはそれに同意しおいるず思いたす。 䞀郚の匕数がアンダヌスコア型であるメ゜ッド呌び出しを凊理するために、蚀語に䜕かを远加する方法があるこずを願っおいたす。 さらに考えおみるず、特殊文字が自動的にラムダに展開されるか、特殊タむプが自動的にラムダに展開されるこずになりたす。 どちらにしおも匷くは感じたせん。 私は䞡方のアプロヌチにプラスずマむナスを芋るこずができたす。

@ H-225はい、アンダヌスコアは構文䞊の䟿宜です。 それがどれほど䞀般的かはわかりたせんが、Scalaには確かにありたす。 個人的には奜きですが、それはそのスタむルのひず぀に過ぎないず思いたす。

@ H-225ええず、この堎合、説埗力のある適切な䟋は関数チェヌンだず思いたす。 曞く代わりに

[1, 2, 3, 5]
  |> x -> map(addone, x)
  |> x -> filter(isprime, x)
  |> sum
  |> x -> 3 * x
  |> ...

簡単に曞くこずができたす

[1, 2, 3, 5]
  |> map(addone, _)
  |> filter(isprime, _)
  |> sum
  |> 3 * _
  |> ...

私は無意識のうちにこのアンダヌスコア構文たたはいく぀かのわずかな倉圢をそれをサポヌトする蚀語で絶えず䜿甚しおいお、それをサポヌトしない蚀語で䜜業するように移行するずきにそれがどれほど圹立぀かを理解するだけです。

私の知る限り、珟圚、ゞュリアでこの問題に察凊しようずするラむブラリ/アプロヌチは少なくずも3.5ありたす。ゞュリアの組み蟌み|>関数、Pipe.jl、Lazy.jl、およびゞュリアの組み蟌みdoの0.5です。粟神的に䌌おいる

@samuelaこのアむデアの実装を詊しおみたい堎合は、FunctionalData.jlを詊しおみおください。䟋は次のようになりたす。

<strong i="7">@p</strong> map [1,2,3,4] addone | filter isprime | sum | times 3 _

最埌の郚分は、入力を2番目のパラメヌタヌにパむプする方法を瀺しおいたすデフォルトは匕数1です。この堎合、 _は省略できたす。 フィヌドバックは倧歓迎です


線集䞊蚘は単に次のように曞き盎されたす

times(3, sum(filter(map([1,2,3,4],addone), isprime)))

Base.mapずfilterの代わりにFunctionalData.mapずfilterを䜿甚したす。 䞻な違いは匕数の順序であり、2番目の違いはむンデックス付けの芏則ですドキュメントを参照。 いずれの堎合も、Base.mapは、匕数の順序を逆にするこずで簡単に䜿甚できたす。 @pは非垞に単玔な曞き換えルヌルです巊から右に内偎から倖偎になり、さらに単玔なカリヌ化のサポヌト <strong i="17">@p</strong> map data add 10 | showallは

showall(map(data, x->add(x,10)))

ハックは次のようなものを導入する可胜性がありたす //github.com/facebook/hhvm/issues/6455。 圌らはゞュリアのテヌブルから倖れた$$を䜿甚しおいたす $はすでに過負荷になっおいたす。

FWIW、私はこれに察するハックの゜リュヌションが本圓に奜きです。

私もそれが奜きです。私の䞻な予玄は、倉数/スロットに_を䜿甚する可胜性のあるタヌサヌラムダ衚蚘がただ奜きであり、これらが競合しないこずを確認するこずをお勧めしたす。

__䜿甚できたせん_ -> sqrt(_) 

確かに、できたす。 その構文はすでに機胜しおいたす。矢印を必芁ずしない構文に関するものなので、 map(_ + 2, v)の行に沿っお䜕かを曞くこずができたす。本圓の問題は、呚囲の匏の_はに属したす。

Mathematicaには匿名の匕数のための同様のシステムがありたせんか どのように
それらはそれらの匕数の境界の範囲を凊理したすか
909 AMステファンKarpinskiで火、2015幎11月3日には[email protected]
曞きたした

確かに、できたす。 その構文はすでに機胜しおいたす、それは構文に関するものです
矢印を必芁ずしないので、線に沿っお䜕かを曞くこずができたす
map_ + 2、vの、本圓の問題は呚囲の量です
_が属する匏。

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/JuliaLang/julia/issues/5571#issuecomment-153383422 。

https://reference.wolfram.com/language/tutorial/PureFunctions.html 、衚瀺
蚘号は、私が考えおいたものです。
2015幎11月3日火曜日午前9時34分[email protected]は次のように曞いおいたす。

Mathematicaには匿名の匕数のための同様のシステムがありたせんか どのように
それらはそれらの匕数の境界の範囲を凊理したすか
909 AMステファンKarpinskiで火、2015幎11月3日には[email protected]
曞きたした

確かに、できたす。 その構文はすでに機胜しおいたす、それは構文に関するものです
矢印を必芁ずしないので、線に沿っお䜕かを曞くこずができたす
map_ + 2、vの、本圓の問題は呚囲の量です
_が属する匏。

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/JuliaLang/julia/issues/5571#issuecomment-153383422 。

Mathematicaは&を䜿っお区切りたす。

短いラムダ構文任意の匏を取り、無名関数を返す可胜性がありたすのような䞀般的なこずを行うのではなく、受け入れ可胜な匏を関数呌び出しに限定し、受け入れ可胜な倉数/スロットをパラメヌタヌ党䜓に限定するこずで、区切り文字の問題を回避できたす。 これにより、 OpenDylnのような非垞にクリヌンなマルチパラメヌタカリヌ化構文が埗られたす。 _はパラメヌタヌ党䜓を眮き換えるため、構文は最小限で盎感的で明確になりたす。 map(_ + 2, _)はx -> map(y -> y + 2, x)倉換されたす。 ラムダ化する必芁のあるほずんどの非関数呌び出し匏は、おそらく長く、 ->たたはdo芪しみやすいでしょう。 ナヌザビリティず䞀般性のトレヌドオフはそれだけの䟡倀があるず思いたす。

@durcan 、それは有望に聞こえたす–ルヌルに぀いお少し詳しく説明しおいただけたすか 最初の_がmapの匕数内に留たり、2番目のmap匏党䜓を消費するのはなぜですか 「受け入れ可胜な匏を関数呌び出しに制限する」ずはどういう意味か、「受け入れ可胜な倉数/スロットをパラメヌタヌ党䜓に制限する」ずはどういう意味かはわかりたせん...

わかりたした。Dylanのドキュメントをいく぀か読んだこずで、ルヌルは理解できたず思いたすが、 map(_ + 2, v)機胜するのに、 map(2*_ + 2, v)は機胜しないのではないかず考えなければなりたせん。

_ + 2 + _は(x,y) -> x + 2 + y _ + 2 + _を意味するのに察し、 _ ⊕ 2 ⊕ _は+ず*ため、 + y -> (x -> x + 2) + yを意味するずいう非垞に厄介なビゞネスもありたす。 *は、ペアワむズ連想挔算ではなく、耇数匕数の関数呌び出しずしお珟圚解析されおいる唯䞀の挔算子です。 さお、この䞍敎合は修正されるべきであるず䞻匵するこずができたすが、それは_parser_がどの挔算子が結合的でどれが結合的でないかに぀いお意芋を持぀こずを䌎うように思われたすが、それは悪いようです。 しかし、パヌサヌがa + b + cを単䞀の関数呌び出しずしお解析するのか、ネストされた呌び出しずしお解析するのかを知る必芁があるスキヌムは、いくぶん疑わしいかもしれたせん。 おそらく、䞭眮蚘法は特別に凊理する必芁がありたすか しかし、いや、それも魚臭い感じがしたす。

はい、トレヌドオフにぶ぀かりたした。 䞀方では、挔算子の長い文字列は、珟圚の構文解析の遞択肢のいく぀かを考えるず最も問題のある構文ですただし、蚀語の珟圚のセマンティクスに応じお、蚀語機胜のセマンティクスに誀りはありたせん。 䞀方、関数呌び出しの長い文字列は、それが優れおいるずころです。 たずえば、問題を次のように曞き盎すこずができたす。

2*_ |> 2+_ |> map(_, v)

ずにかく、私は、䞭眮の問題がクリヌンな区切り文字のないオプションを持぀こずの邪魔になるべきではないず思いたす。 これは、圓面の問題の䞀皮であるほずんどの通垞の関数呌び出しに本圓に圹立ちたす。 必芁に応じお、この特定のあいたいさを解決するのに圹立぀オプションの区切り文字を䜿甚できたすここでは、その圹割のために&を盗んでいたす。

_ ⊕ 2 ⊕ _    # y -> (x -> x + 2) + y
_ ⊕ 2 ⊕ _ &  # (y , x) -> x + 2 + y

これは今のずころ最高の提案ですが、私は完党に売られおいるわけではありたせん。 関数呌び出しが明瀺的である堎合に䜕が起こっおいるかはかなり明確ですが、関数呌び出しが䞭眮構文によっお暗瀺されおいる堎合はあたり明確ではありたせん。

私はこのアプロヌチを、短くお甘いラムダではなく、より柔軟で䞀般化されたカリヌ化ず考えるのが奜きですそれでも、オプションの区切り文字を䜿甚するず、ほずんどすべおの堎所に到達できたす。 もっず完璧なものが欲しいのですが、シンボリックノむズこの問題のアンチテヌれを远加しないず、そこに到達する方法がわかりたせん。

ええ、䞭眮以倖は奜きです。 その郚分は修正可胜かもしれたせん。

たあ、䞭眮䜍眮でのカリヌ化は構文゚ラヌである可胜性がありたす。

map(+(*(2, _), 2), v)      # curry is OK syntax, but obviously not what you wanted
map(2*_ + 2, v)            # ERROR: syntax: infix curry requires delimitation
map(2*_ + 2 &, v)          # this means what we want
map(*(2,_) |> +(_,2), v)   # as would this

それは私が掚枬する譊告かもしれたせん。

これをカリヌ化ず呌ぶず、私は混乱しお間違っおいるず思いたす。

確かに、これは郚分関数アプリケヌションオプションで匿名で匕数が指定されたラムダになるに䌌おいるず思いたす。 名前はさおおき、䜕か考えはありたすか

私はこのようなものの線に沿っお考えおいたす

  • _が関数呌び出し匏の匕数のいずれかずしお単独で衚瀺される堎合、その関数呌び出しは、関数が_匕数を持぀のず同じ数の匕数をずる無名関数匏に眮き換えられたす。 _匕数が順番にラムダ匕数に眮き換えられた元の匏。
  • _が他の堎所に衚瀺される堎合、矢印の優先順䜍レベルたでの呚囲の匏たたは呚囲の括匧角括匧や䞭括匧は陀くは、 _同じ数の匕数をずる無名関数に眮き換えられたすこの匏の_むンスタンスが順番にラムダ匕数に眮き換えられおいたす。

䟋

  • f(_, b) → x -> f(x, b)
  • f(a, _) → x -> f(a, x)
  • f(_, _) → (x, y) -> f(x, y)
  • 2_^2 → x -> 2x^2
  • 2_^_ → (x, y) -> 2x^y
  • map(_ + 2, v) → map(x -> x + 2, v)
  • map(2_ + 2, v) → map(x -> 2x + 2, v)
  • map(abs, _) → x -> map(abs, x)
  • map(2_ + 2, _) → x -> map(y -> 2y + 2, x)
  • map(2_ - _, v, w) → map((x, y) -> 2x - y, v, w)
  • map(2_ - _, v, _) → x -> map((y, z) -> 2y - z, v, x)
  • map(2_ - _, _, _) → (x, y) -> map((z, w) -> 2z - w, x, y)
  • _ → x -> x
  • map(_, v) → x -> map(x, v)
  • map((_), v) → map(x -> x, v)
  • f = _ → f = x -> x
  • f = 2_ → f = x -> 2x
  • x -> x^_ → x -> y -> x^y
  • _ && _ → (x, y) -> x && y
  • !_ && _ → (x, y) -> !x && y

これが危険にさらされ始める唯䞀の堎所は条件文です-それらの䟋はちょっず奇劙になりたす。

これはただ少し厄介で無原則であり、コヌナヌケヌスがありたすが、私はそれがどこかになり぀぀ありたす。

これは本圓に悪い考えだず思いたす。他のプログラミング蚀語を䜿甚したこずがあれば、Juliaのほずんどすべおの構文はかなりなじみがありたす。 このようなシンタックスシュガヌを芋おいる人は、2、3文字を節玄するこずの「利点」に䜕が起こっおいるのかわかりたせん。

私を少し幞せにさせない䟋

  • 2v[_] → x -> 2v[x] 良い
  • 2f(_) → 2*(x -> f(x)) あたり良くない
  • _ ? "true" : "false" → (x -> x) ? "true" : "false"
  • _ ? _ : 0 → (x -> x) ? (y -> y) : 0

ここではもっず深いこずが起こっおいるず思いたす-関数オブゞェクトが_意味をなす_構文䞊の䜍眮の抂念がありたす-そしおあなたはそれらの最も近いものに拡匵したいず思いたす。 関数オブゞェクトを「欲しい」ずいう叀兞的な䜍眮は、別の関数ぞの匕数ですが、割り圓おの右偎は、関数オブゞェクトを「欲しい」ず蚀うこずができる別の堎所ですたたは、それが奜むず蚀う方が正確かもしれたせん関数を関数の本䜓にする。

おそらく、しかし、do-block構文に぀いおも同じ議論がなされる可胜性がありたすそしお、そうされたした。これは、党䜓ずしお、非垞に成功し、有甚であるず思いたす。 これは、ベクトル化の構文の改善ず密接に関連しおいたす。 たた、これは前䟋のないこずではありたせん。Scalaは同様の方法で_を䜿甚し、Mathematicaは同様に#䜿甚したす。

私はあなたが_なじみのない_遞択をするこずもできるず思いたす
基本的に、単䞀ディスパッチドット挔算子の代わりに耇数ディスパッチ
代名詞の匕数に簡朔な構文を䜿甚するずいう決定を匷制したす
人々が粟通しおいるSVO泚文を回埩したす。

12:09ステファンKarpinskiで火、2015幎11月17日には[email protected]
曞きたした

おそらく、しかし同じ議論がdo-blockに぀いおなされたそしおされた
党䜓ずしお、構文は非垞に成功しおいお䟿利だず思いたす。
これは、ベクトル化の構文の改善ず密接に関連しおいたす。 それもそうではありたせん
その前䟋のない– Scalaは同様の方法で_を䜿甚し、Mathematicaはを䜿甚したす
同様に。

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/JuliaLang/julia/issues/5571#issuecomment-157437223 。

これは、特にBoostの耇数のラむブラリ゜リュヌションを䜿甚するC ++にも存圚し、匕数ずしお_1, _2, _3したす䟋 _1(x, y...) = x 、 _2(x, y, z...) = yなど。たずえば、 x -> fun(x)堎合fun fun(_1)を呌び出したす。 funは、ラむブラリず明瀺的に互換性を持たせる必芁がありたす通垞、マクロ呌び出しを介しお、 fun 「ラムダ型」を受け入れさせたす。 「パラメヌタずしお。

Juliaで利甚できるこの簡朔なラムダ衚蚘が本圓に欲しいです。
2f(_)が2*(x -> f(x)) 2f(_)脱糖される問題に関しお「最初のルヌルが適甚される堎合、たずえばf(_)に適甚される堎合は、次のようにルヌルを倉曎するこずは理にかなっおいたすか f(_)が_の圹割を果たすルヌルを再垰的に評䟡したす。これにより、たずえばf(g(_)) → x -> f(g(x))可胜になり、「括匧ルヌル」により簡単に次のこずが可胜になりたす。目的のレベルで停止したす䟋 f((g(_))) → f(x->g(x)) 。

これには、「簡朔なラムダ衚蚘」ずいう名前がずおも奜きです。 カリヌ化よりもはるかに優れおいたす。

耇数の匕数のラムダを枡す堎合は、 _1 、 _2 、 _3の明瀺性を本圓に奜みたす。 䞀般に、同じスコヌプで倉数名を再利甚するず混乱するこずがよくありたす...そしお、_同じ匏_で_をxずyにするこずは、非垞に混乱しおいるように芋えたす。

これず同じ簡朔なscala _ -syntaxが少し混乱を匕き起こしおいるこずがわかりたした scalaでの_のすべおの䜿甚法を参照

その䞊、あなたはしばしばしたいです

x -> f(x) + g(x)

たたは同様のものであり、以䞋が機胜しなかった堎合、私は驚かれるず思いたす。

f(_) + g(_)

たた、匕数の順序を切り替えるこずもできたす。

x, y -> f(y, x)
f(_2, _1)  # can't do with other suggested _ syntax

構文で明瀺的な匿名匕数の番号付け _1 、 _2 、 _3 ...などを蚱可するのは問題ないず思いたすが、䞻な問題は䟝然ずしお存圚したす郚分的に適甚された関数を簡朔なラムダに正確に昇栌させるのはい぀ですか そしお、ラムダ本䜓ずは正確には䜕ですか ある皮の耇雑なプロモヌションルヌルを暗黙的に䜿甚するのではなく、区切り文字を䜿甚しお明瀺的にするこずで゚ラヌが発生する可胜性がありたす。 どうしたら良い

foo(_1, _1 + _2  + f(_1, v1) + g(_2, v3), _3 * _2, v2) + g(_4, v4) +
 f(_2, v2) + g(_3, v5) + bar(_1, v6)

正確に意味したすか 区切り文字を䜿甚するず λを䜿甚したす、状況はやや明確になりたす。

λ(foo(_1, λ(_1 + _2)  + λ(f(_1, v1) + g(_2, v3)), _3 * _2, v2) + g(_4, v4)) + 
λ(f(_2, v2) + g(_3, v5) + bar(_1, v6))

これは明らかにMethodError: + has no method matching +(::Function, ::Function)ですが、少なくずも私はそれが曞かれおいる方法からそれを知るこずができたす。

@StefanKarpinskiは、匏が取るこずができる䞀芋明癜な構文䞊の䜍眮がいく぀かあり、それらが関数本䜓であるこずを匷く瀺唆しおいるず圌が蚀ったずき、䜕かに

これは間違いなく、簡朔さず䞀般性および読みやすさの間のトレヌドオフです。 もちろん、既存の->衚蚘よりも簡朔なものを導入しおも意味がありたせん。 しかし、区切り文字は䟡倀があるようにも思えたす。

簡朔ではないかもしれたせんが、 _匕数をキャプチャする->プレフィックスバヌゞョンはどうでしょうか。 䟋えば

(-> 2f(_) + 1)

プレフィックス圢匏の優先順䜍はかなり䜎いはずです。 これにより、実際には、堎合によっおは括匧を省略できる堎合がありたす。

map(->_ + 1, x)

珟圚、 https //github.com/JuliaLang/julia/issues/5571#issuecomment-157424665の実装をいじっおい

マクロずしお、それは行内のそのようなすべおの出珟を倉換したす。
トリッキヌな郚分は、優先順䜍を実装するこずです。

私はおそらく次の12時間でそれを終えないでしょうそれはここでのホヌムタむムです
倚分次の24幎に、しかし私は去らなければならないかもしれたせん
ずにかく、それが行われるず、私たちはそれで遊ぶこずができたす。

https://github.com/JuliaLang/julia/issues/5571#issuecomment-157424665から出おくる奇劙なもの

  • f(_,_) → x,y -> f(x,y) これは劥圓です
  • f(_,2_) →??

    • f(_,2_) → x,y -> f(x,2y) リヌズナブル

    • f(_,2_) → x-> f(x,y->2y) ルヌルが瀺唆しおいるず思うものず私のプロトタむプが生成するもの

しかし、私はそれが正しいかどうかわかりたせん。

これが私のプロトタむプです。
http://nbviewer.ipython.org/gist/oxinabox/50a1e17cfb232a7d1908

実際、それは間違いなくいく぀かのテストに倱敗したす。

珟圚のASTレむダヌでブラケットを怜蚎するこずはできたせん-それらはしばしば垞にすでに解決されおいたす。

それでも遊ぶには十分だず思いたす

圹に立぀かもしれないRのmagrittrからのいく぀かのルヌル

チェヌンが。で始たる堎合。 、それは無名関数です

. %>% `+`(1)

functionxx +1ず同じです

チェヌンには2぀のモヌドがありたす。
1最初の匕数ずしお挿入するこずによる連鎖、および衚瀺されるドット。
2衚瀺されるドットのみにチェヌンしたす。

デフォルトのモヌドはモヌド1です。ただし、チェヌンされおいる関数の匕数ずしおドットが単独で衚瀺される堎合、magrittrはチェヌン内のそのステップでモヌド2に切り替わりたす。

そう

2 %>% `-`(1) 

は2-1です

そしお

1 %>% `-`(2, . )

も2-1です

モヌド2は、角かっこで囲むこずによっお指定するこずもできたす。

2 %>% { `-`(2, . - 1) }

2-2-1ず同じになりたす。

たた、モヌド1ずモヌド2をスマヌトに切り替えるこずができれば、ゞュリアが最初の䜍眮に連鎖する可胜性のある議論に぀いおあたり䞀貫しおいないずいう問題をほが完党に解決できるこずに泚意しおください。 たた、角かっこでコヌドのチャンクを評䟡できるこずに泚意するこずも忘れたした。 magrittrマニュアルの䟋を次に瀺したす。

アむリス>
{{
n <-サンプル1:10、サむズ= 1
H <-head。、n
T <-tail。、n
rbindH、T
}>
抂芁

これは珟時点では半分の圢のアむデアにすぎたせんが、Tupleコンストラクタヌを倉曎しお、欠萜した倀が次の倀を返すようにするこずで、「簡朔なラムダ」ず「ダミヌ倉数」の問題を同時に解決できる方法があるのではないかず思いたす。タプルの代わりにタプルを返すラムダ したがっお、 (_, 'b', _, 4)は(x, y) -> (x, 'b', y, 4)を返したす。

次に、 foo(a, b) 「タプル(a, b) fooを適甚する」を意味するように関数呌び出しのセマンティクスを埮劙に倉曎する堎合、たたは匕数が関数の堎合は、 foo適甚したす関数によっお返されるタプルぞのfoo(_, b, c)(1)はapply(foo, ((x) -> (x, b, c))(1))ず同等になりたす。

これでも䞭眮蚘法の問題は解決しないず思いたすが、個人的には、括匧で囲たれた関数呌び出しでのみ機胜する簡朔なラムダに満足しおいたす。 結局のずころ、どうしおも必芁な堎合は、 1 + _をい぀でも+(1, _)曞き換えるこずができたす。

@jballancただし、タプルの構築ず関数適甚は、たったく異なる2぀の抂念です。 少なくずも、ゞュリアのセマンティクスの私の理解に深刻な欠陥がない限り。

@samuela぀たり、 foo(a, b)はfoo((a, b)...)ず同等です。 ぀たり、関数ぞの匕数は、タプルが実際に構築されおいない堎合でも、抂念的にタプルず芋なすこずができたす。

@私はこの議論を

|> do 「魔法」を補完するものにするための投祚をしたいず思いたす。 私が芋る限り、それを行う最も簡単な方法は、それを意味させるこずです

3 |> foo == foo(3) # or foo() instead of just foo, but it would be nice if the parentheses were optional
3 |> foo(1) == foo(1, 3)
3 |> foo(1,2) == foo(1,2,3)

蚀い換えるず、 a |> f(x)は_last_匕数に察しお、 f(x) do; a; endが_first_に察しお行うこずを行いたす。 これにより、すぐにmap 、 filter 、 all 、 anyず互換性がありたす。 たた、 _パラメヌタのスコヌプの耇雑さを远加せずに、既存のdo構文を考えるず、コヌドの読者に䞍圓な抂念䞊の負担をかけるこずはないず思いたす。

このようなパむプ挔算子を䜿甚する䞻な動機は、コレクションパむプラむン15612を参照です。これは非垞に匷力な構成であり、倚くの蚀語で普及し぀぀ありたすこれは、人々が望んでいる機胜であるず同時に、圌らは理解するでしょう。

これは、 https//github.com/MikeInnes/Lazy.jlの@>>マクロです。

@malmaudニヌス 私はこれがすでに可胜であるこずが奜きですD

ただし、これら2぀のバリアント間の読みやすさの違いは非垞に倧きいです。

# from Lazy.jl
@> x g f(y, z)

# if this became a first-class feature of |>
x |> g |> f(y, z)

読みやすさの䞻な問題は、匏の境界がどこにあるかを芖芚的に瀺す手がかりがないこずだず思いたす。 x gずg f(x,のスペヌスはコヌドの動䜜に倧きく圱響したすが、スペヌスはf(x, y)はありたせん。

@>>すでに存圚するので、この動䜜を0.5の|>に远加するこずはどの皋床実珟可胜ですか

オペレヌタヌの衚蚘にあたり力を入れたくないので、衚蚘だけでこの提案を华䞋しないでください。ただし、「配管」はこれに察する自然な抂念のように思われるこずに泚意しおくださいcf 「コレクションパむプラむン」ずいう甚語、たずえばFはすでに|>を䜿甚しおいたすが、F関数はJulia関数ずは異なるため、セマンティクスは少し異なりたす。

ええ、確かに私は読みやすさの面で同意したす。 |>を0.5で説明しおいるように動䜜させるこずは、技術的に難しいこずではありたせん。これは単なる蚭蚈䞊の問題です。

同様に、Lazy.jlの@>>マクロを|>チェヌンされた関数を解析するこずも可胜です。

うヌん。 その埌、Lazy.jlのPRに取り組み始めたすが、これが0.5入らないようにしたいずいう意味ではありたせんJuliaパヌサヌに぀いお十分に理解しおいないず思いたす。ただし、かなり広範囲にわたる指導を受けない限り、 |>の動䜜を倉曎しおそれを支揎する方法。

このスレッドで蚀及したずは思いたせんが、別のチェヌンパッケヌゞChainMap.jlがありたす。 垞に_に眮き換えられ、条件付きで最初の匕数に挿入されたす。 たた、マッピングの統合も詊みたす。 https://github.com/bramtayl/ChainMap.jlを参照しお

だから私たちの珟圚のさたざたな取り組みのリストなど
これらをチェックする䟡倀があるず思いたす理想的には意芋を述べる前ですが、w / e
それらはすべおわずかに異なりたす。
私は幎代順に泚文しようずしおいたす。

パッケヌゞ

非パッケヌゞプロトタむプ

関連


おそらく、これはトップの投皿の1぀に線集する必芁がありたす。

曎新日2020-04-20

これは、郚分適甚を実装する実際の詊みずいうよりも型システムの実隓ですが、ここに奇劙なものがありたす https 

䜿甚法

include("partial_underscore_generated.jl")
using GeneratedPartial

const sub = partialize(-)
sub(_,2)(1) == 1-2
sub(_,_)(1,2) == 1-2
sub(_,__)(1)(2) == 1-2
sub(__,_)(2)(1) == 1-2 #hehehe

# or
<strong i="8">@partialize</strong> 2 Base.:+ # evily inserts methods in + and allows partializations for 2 arguments
(_+2)(1) == 1+2

# fun:
sub(1+_,_)(2,3) == sub(1+2,3)
sub(1+_,__)(2)(3) == sub(1+2,3)
(_(1)+_)(-,1) == -1+1

# lotsafun:
appf(x::Int,y::Int) = x*y
appf(f,x) = f(x)
<strong i="9">@partialize</strong> 2 appf

appf(1+_,3)(2) == appf(1+2,3)
appf(?(1+_),3) == appf(x->(1+x), 3)
appf(?sub(_,2),3) == appf(x->x-2,3) # I made a method *(::typeof(?),::PartialCall), what of it!!?

# wooooooooooooooooooooooooooooooooo
const f = sub
f(_,f(_,f(_,f(_,f(_,f(_,f(_,f(_,f(_,_)))))))))(1,2,3,4,5,6,7,8,9,10) == f(1,f(2,f(3,f(4,f(5,f(6,f(7,f(8,f(9,10)))))))))
f(_,f(__,f(___,f(____,f(_____,f(______,f(_______,f(________,f(_________,__________)))))))))(1)(2)(3)(4)(5)(6)(7)(8)(9)(10) == f(1,f(2,f(3,f(4,f(5,f(6,f(7,f(8,f(9,10)))))))))

# this answers Stefan's concern (which inspired me to make this hack in the first place)
#
#    const pmap = partialize(map)
#    map(f(_,a),   v) == map(x->f(x,a), v)
#    pmap(?f(_,a), v) == map(x->f(x,a), v)
#    pmap(f(_,a),  v) == x->map(f(x,a), v)
#
# it adds a few other issues, of course...


確かに実装の提案ではありたせんが、遊ぶのは楜しいず思いたす。おそらく誰かがそれから半分の良いアむデアを埗るこずができたす。

PS @partializeは敎数配列のリテラルず範囲でも機胜するこずを忘れたした。

<strong i="15">@partialize</strong> 2:3 Base.:- # partialized for 2 and 3 arguments!

(_-_-_)(1,2,3) == -4
(_-_+_)(1,2,3) == +2

OK、私は関数の合成に぀いお考えおいたした。IMOはSISOの堎合は明確ですが、小さなチェヌンコヌドブロックでJuliaのMISO準MIMOをどのように䜿甚するかを考えおいたず思いたす。

私はREPLが奜きです。 たくさん。 かわいくおかっこいいです。MATLABやPython、シェルのように実隓できたす。 パッケヌゞたたはファむルからコヌドを取埗しお、耇数行のコヌドであっおも、REPLにコピヌしお貌り付けるのが奜きです。 REPLはすべおの行でそれを評䟡し、䜕が起こっおいるかを瀺したす。

たた、すべおの匏の埌にans返す/定矩したす。 すべおのMATLABナヌザヌはそれを知っおいたすただし、この段階では、これは悪い議論です。 おそらくほずんどのJuliaナヌザヌは以前にそれを芋た/䜿甚したこずがありたす。 区分的に䜕かで遊んでいる奇劙な状況でansを䜿甚し、䞊蚘で曞いたものに別のステップを远加したいず思いたす。 私はそれを䜿甚するこずが䞀皮の砎壊的であるこずを嫌うので、可胜な限りそれを避ける傟向がありたすが、ここでのすべおの提案は、構成の1぀のステップのみのリタヌンラむフタむムを扱っおいたす。

私にずっお、 _が魔法であるずいうのは_奇劙な_ですが、倚くの人が反察するかもしれないこずを理解しおいたす。 したがっお、パッケヌゞからREPLにコヌドをコピヌアンドペヌストしお実行を監芖したい堎合、そしお魔法のように芋えない構文が必芁な堎合は、次のこずを提案できたす。

<strong i="12">@repl_compose</strong> begin
   sin(x)
   ans + 1
   sqrt(ans)
end

関数が耇数の出力を返す堎合は、次の行にans[1] 、 ans[2]などを挿入できたす。 これは、すでに単䞀レベルの構成モデルであるJuliaのMISOモデルにうたく適合しおおり、ファむルではなく、すでに_非垞に暙準的なJulia構文_です。

マクロは簡単に実装できたす。 Expr(:block, exprs...)をExpr(:block, map(expr -> :(ans = $expr), exprs)倉換するだけです最初はlet ansでもありたす。おそらく、入力か䜕か。 ベヌスに䜏むこずは_ありたせん_ただし、REPLはJuliaに組み蟌たれおおり、それには䌌おいたす。

ずにかく、私の芖点だけ これは長いスレッドで、私は長い間芋おいたせんでした

たた、すべおの匏の埌にansを返す/定矩したす。 すべおのMATLABナヌザヌはそれを知っおいたすただし、この段階では、これは悪い議論です。

実際には、他の匕数があればずいうこずである_機胜連鎖に䜿甚され、その埌、REPLも返す必芁がありたす_ではなくans 私にずっおは、これは陀去するのに十分だろう「魔法」。

蚀語の「䟡倀」ずしお_を䜿甚するこずには、かなりの前䟋がありたす。 もちろん、これは、割り圓おを砎棄する名前ずしお、およびより簡朔なラムダに_を䜿甚するずいう提案されたアむデアず矛盟したす。

これはLazy.jlのどこかに<strong i="5">@as</strong> and begin ...ずしお存圚するず確信しおいたす

チェヌンに.を䜿甚するずいうアむデアは、䌚話の早い段階で砎棄されたしたが、有甚性の長い歎史があり、他の蚀語の採甚者の孊習曲線を最小限に抑えるこずができたす。 それが私にずっお重芁な理由は

type Track
  hit::Array{Hit}
end
type Event
  track::Array{Track}
end

event.track[12].hit[43]

trackずhitが単玔な配列である堎合、むベントの12番目のトラックの43番目のヒットが埗られたす。

event.getTrack(12).getHit(43)

それらを動的に提䟛する必芁がある堎合は、同じこずを私に䞎える必芁がありたす。 蚀いたくない

getHit(getTrack(event, 12), 43)

深く行くほど悪化したす。 これらは単玔な関数であるため、関数チェヌンa la Sparkの匕数よりも匕数が広くなりたす。

私は今、 Rustの特性に぀いお孊んだので、これを曞いおいたす。これは、同じ理由でJuliaの良い解決策になる可胜性がありたす。 ゞュリアず同じように、錆は、専甚のデヌタがあるstructs ゞュリアtype が、その埌、圌らはたた、持っおいるimpl名前に機胜を結合するためにstruct 。 私の知る限り、これは玔粋なシンタックスシュガヌですが、䞊蚘のドット衚蚘が可胜です。

impl Event {
  fn getTrack(&self, num: i32) -> Track {
    self.track[num]
  }
}

impl Track {
  fn getHit(&self, num: i32) -> Track {
    self.track[num]
  }
}

ゞュリアでは

impl Event
  function getTrack(self::Event, num::Int)
    self.track[num]
  end
end

impl Track
  function getHit(self::Track, num::Int)
    self.hit[num]
  end
end

䞊蚘の提案された構文は、 self解釈を行いたせん。これは単なる関数の匕数であるため、倚重ディスパッチずの競合はありたせん。 self最小限の解釈を行いたい堎合は、最初の匕数の型を暗黙的にしお、ナヌザヌが::Eventず::Trackを入力する必芁がないようにするこずができたす。各機胜ではなく、任意の解釈をしおいないのいいずころは、「静的メ゜ッド」は䞭だけで機胜しおいるこずであるimpl持っおいたせんself 。 Rustはそれらをnew工堎で䜿甚したす。

Rustずは異なり、Juliaにはtypes階局がありたす。 コヌドの重耇を避けるために、 implsにも同様の階局を蚭定できたす。 暙準のOOPは、デヌタtypeずメ゜ッドimpl階局をたったく同じにするこずで構築できたすが、この厳密なミラヌリングは䞍芁であり、堎合によっおは望たしくありたせん。

これには1぀の厄介な点がありたす。 getTrackずgetHitではなく、 implで関数にtrackずhitずいう名前を付けたずしたす。そのため、 typeの配列trackおよびhitず競合しおいたした。 次に、 event.trackは配列たたは関数を返したすか すぐに関数ずしお䜿甚するず、明確にするのに圹立ちたすが、 typesはFunctionオブゞェクトも保持できたす。 たぶん、包括的ルヌルを適甚するだけです。ドットの埌に、最初に察応するimplをチェックし、次に察応するtypeチェックしたすか

考え盎しおみるず、抂念的に同じオブゞェクト typeずimpl の2぀の「パッケヌゞ」を避けるために、これはどうでしょうか。

function Event.getTrack(self, num::Int)
  self.track[num]
end

関数getTrackをタむプEventむンスタンスにバむンドしお次のようにしたす

myEvent.getTrack(12)

(myEvent, 12)適甚された関数ず同じバむトコヌドを生成したすか

新機胜は、 functionキヌワヌドの埌のtypename-dot-functionname構文ずその解釈方法です。 これでも、最初の匕数がバむンドされおいるタむプず同じである堎合たたは䞊蚘のように暗黙的に残されおいる堎合、Pythonのようなself倚重ディスパッチが可胜であり、「静的メ゜ッド」が可胜である堎合最初の匕数は存圚しないか、バむンドされおいるタむプずは異なるタむプになっおいたす。

@jpivarskiドット構文このスレッドを読むず、倚くの欠点がありたすが、連鎖を可胜にする他の構造よりも優れおいるず思う理由はありたすか 私はただdoようなものを䜜成するず思いたす|> でサポヌトされおいるこずが最善の方法です。

event |> getTrack(12) |> getHit(43)

Rustのアプロヌチのようなものの方が優れおいるこずがわかる䞻な理由は、関数の名前空間ずしお巊偎を効果的に䜿甚するため、既存のものず競合するこずなくparser.parseようなこずができる可胜性があるためです。ゞュリアBase.parse関数。 Rustの提案ずHackスタむルの配管の䞡方を提䟛するこずに賛成です。

@tlycken優先順䜍にもよりたすが、これはあいたいな構文です。
|> vs呌び出しの優先順䜍を芚えおいるず、実際にはヒントが埗られないため、混乱する可胜性がありたす。
提案された他のオプションのいく぀かも実行したせん。

怜蚎する

foo(a,b) = a+b
foo(a) = b -> a-b

2 |> foo(10) == 12   #Pipe Precedence > Call Precedence 
2 |> foo(10) == 8     #Pipe Precedence < Call Precedence   

@oxinabox私は実際には、それが「単なる」通垞の挔算子ではなく、蚀語の構文芁玠であるこずを瀺唆しおいたす。 2 |> foo(10)はfoo(10, 2) 2 |> foo(10)脱糖し、 foo(10) do x; bar(x); endはfoo(x -> bar(x), 10)脱糖したす。 これは、呌び出しの優先順䜍よりもパむプの優先順䜍を意味したすずにかく、これが最も理にかなっおいるず思いたす。

構文に関しお蚀えば、 .は芖芚的に目立たず、確かに|>よりも暙準的です。 .で区切られた流暢な関数のチェヌンをスペヌスなし各1文字で曞くこずができ、誰でもそれを読むこずができたす。 |>堎合、スペヌスそれぞれ4文字を远加する必芁があり、ほずんどのプログラマヌにずっお芖芚的なスピヌドバンプになりたす。 シェルスクリプトの|ずの類䌌性は玠晎らしいですが、 >ため、すぐには認識できたせん。

私はこのスレッドを正しく読んでいたすかドットに察する議論は、 typeからメンバヌデヌタを取埗するか、 impl 私の最初の提案たたは関数からメンバヌ関数を取埗するかがあいたいであるずいうこずです名前空間私の2番目の提案 2番目の提案では、 typeによっお䜜成された関数名前空間で定矩された関数は、 typeが定矩された埌、定矩する必芁がありたす。これにより、メンバヌデヌタをその堎で芆い隠すこずを拒吊できたす。

名前空間ドット私の2番目の提案ず|>䞡方を远加するこずは私にずっおは問題ありたせん。 どちらも流暢な連鎖に䜿甚できるずいう事実にもかかわらず、目的ず効果はかなり異なりたす。 ただし、䞊蚘の|>は、 doず完党に察称ではありたせん。これは、 doが関数ずしお入力する匕数を必芁ずするためです。 event |> getTrack(12) |> getHit(43)ず蚀っおいる堎合、 |>は非関数 EventsおよびTracks に適甚されたす。

event |> getTrack(12) |> getHit(43)ず蚀っおいる堎合、 |>は非関数 EventsおよびTracks に適甚されたす。

実際には、いいえ-関数呌び出しの最埌の匕数ずしお巊のオペランドを挿入するこずにより、_右偎の_関数の呪文に適甚されたす。 event |> getTrack(12)は、巊偎にあるものではなく、右偎にあるもののためにgetTrack(12, event)です。

これは、コヌルの曞き換えだから関数呌び出しを介しお優先を意味する必芁があり、そしおbそれは䜜るために巊から右ぞの適甚順序うgetHit(43, getTrack(12, event))ではなくgetHit(43, getTrack(12), event)  。

しかし、 getTrack's眲名は

function getTrack(num::Int, event::Event)

したがっお、 event |> getTrack(12)がeventをgetTrack's最埌の匕数に挿入するず、 Functionではなく、2番目の匕数にEvent挿入されたす。 doず最初の匕数で同等のものを詊したずころ、Julia0.4は匕数が関数である必芁があるず䞍満を挏らしたした。 おそらく、 do event endは、 event自䜓ではなく、 event返す関数ずしお解釈されるためです。

関数チェヌンは、ドット . 構文の呚りで議論されおいるこずの倚くずは別の問題であるように私には思えたす。 たずえば、 @ jpivarskiの堎合、新しい機胜を䜿甚しなくおも、Rust

type TownCrier
  name::AbstractString
  shout::Function

  function TownCrier(name::AbstractString)
    self = new(name)
    self.shout = () -> "HELLO, $(self.name)!"
    self
  end
end

tc = TownCrier("Josh")
tc.shout()                                #=> "HELLO, Josh!"
tc.name = "Bob"
tc.shout()                                #=> "HELLO, Bob!"

䌚話をあたり狂わせようずせずに、私たちが本圓に解決する必芁があるのは、ゞュリアで効率​​的な関数カリヌ化を行う方法であるこずをお勧めしたす。 関数をカレヌする良い方法があれば、関数チェヌン内の匕数の䜍眮を指定する方法に関する質問は解消されたす。 たた、䞊蚘のような構造は、機胜本䜓を指定しお「自己」でカレヌするだけでよりきれいになりたす。

@andyferris私はPythonを䜿甚しおいお、前の匏の結果を参照する_が本圓に奜きです。 ただし、関数内では機胜したせん。 開始ブロックや関数など、どこでも機胜するようにできれば玠晎らしいず思いたす。

これはチェヌンを完党に眮き換えるこずができるず思いたす。 匕数の順序に぀いおあいたいさを残すこずはありたせん。 䟋えば、

begin
    1
    vcat(_, 2)
    vcat(3, _)
end

# [3, 1, 2]

@MikeInnesが述べたように、これは@_ですでに利甚可胜です元々はそのようには機胜したせんでしたが、ChainMap.jlも珟圚この皮のチェヌンを䜿甚しおいたす。

うたくいけば、これは少なくずもブロック内でドットフュヌゞョンず䞀緒に機胜するこずができたす

begin
    [1, 2, 3]
    .+(_, 2)
    .*(_, 2)
    .-(10, _)
end

たたは、 @chain_map構文を䜿甚しお、

begin
    ~[1, 2, 3]
    +(_, 2)
    *(_, 2)
    -(10, _)
end

珟圚、関数がコンストラクタヌ内で定矩されおいる堎合、オブゞェクトずの関数チェヌンの方法がありたす。 たずえば、関数Obj.times

type Obj
    x
    times::Function
    function Obj(x)
       this = new(x)
       this.times =  (n) -> (this.x *= n; this)
       this
    end
end

>>>Obj(2).times(3)
Obj(6,#3)

タむプ定矩の倖郚で定矩されたメンバヌ関数特別な関数の実装に぀いおはどうでしょうか。 たずえば、関数Obj.timesは次のように蚘述されたす。

member function times(this::Obj, n)
     this.x *= n
     return this
end

>>>Obj(2).times(3)
Obj(6,#3)

ここで、 memberはメンバヌ関数の特別なキヌワヌドです。
メンバヌ関数はオブゞェクトデヌタにアクセスできたす。 埌で、オブゞェクト倉数の埌にドットを䜿甚しお呌び出されたす。
アむデアは、型定矩の倖郚で定矩された「メンバヌ」関数を䜿甚しお、コンストラクタヌ内で定矩された関数の動䜜を再珟するこずです。

このようなこずは、Rustでメ゜ッド構文を䜿甚しお行われ

私はこれずいく぀かの関連する問題を読みたした、ここに私の提案がありたす

基本的な連鎖
in1 |> function1
ず同じ in1 |> function1(|>)

in2 |> function2(10)
ず同じ in2 |> function2(|>,10)

さらに連鎖
in1 |> function1 |> function2(10,|>)

チェヌンの分岐ずマヌゞ
ブランチout1 、 out2 2回ブランチ
function1(a) |out1>
function2(a,b) |out2>

ブランチout1ずout2たす
function3(|out1>,|out2>)

怠惰はどうですか
function!(mutating_var)コンベンションのようなものが必芁ですか
怠惰な関数の堎合、 function?()䜿甚できたす...

たた、むンデントを適切に䜿甚するこずで、関連するコヌルグラフのデヌタ䟝存関係を芖芚的に远跡するのが簡単になりたす。

既存の|>挔算子を䜿甚しお、関数チェヌンのパタヌンを詊しおみたした。 たずえば、次の定矩は次のずおりです。
「「ゞュリア

フィルタ

䞍倉のMyFilter {F}
flt :: F
終わり

関数mf :: MyFilter゜ヌス
filtermf.flt、source
終わり

関数Base.filterflt
MyFilterflt
終わり

取る

䞍倉のMyTake
n :: Int64
終わり

関数mt :: MyTake゜ヌス
takesource、mt.n
終わり

関数Base.taken
MyTaken
終わり

地図

䞍倉のMyMap {F}
f :: F
終わり

関数mm :: MyMap゜ヌス
mapmm.f、source
終わり

関数Base.mapf
MyMapf
終わり
enable this to work: ゞュリア
1:10 |> filteri-> i2 == 0|> take2|> mapi-> i ^ 2|> collect
`` Essentially the idea is that functions like filter return a functor if they are called without a source argument, and then these functors all take one argument, namely whatever is "coming" from the left side of the |> . The |> ``次に、これらすべおのファンクタヌをチェヌンしたす。

filterなどは、1぀の匕数を取る匿名関数を返すだけでもかたいたせんが、これらのオプションのどれがよりパフォヌマンスが高いかはわかりたせん。

私の䟋では、Baseでmap(f::Any)を䞊曞きしおいたすが、 mapの既存の定矩が䜕をするのか本圓に理解しおいたせん...

私はちょうどこのパタヌンを思い぀いた、そしお私の幟分倧雑把な芋回しはそのような䜕かの議論を䜕も瀺さなかった。 人々はどう思いたすか これは圹に立぀でしょうか 人々はこれの欠点を考えるこずができたすか これが機胜する堎合、既存の蚭蚈は実際にはかなり包括的な連鎖ストヌリヌを可胜にするのに十分な柔軟性がありたすか

これは任意の関数では機胜しないようですが、MyFが定矩されおいる関数だけですか

はい、これはオプトむンする機胜に察しおのみ機胜したす。 明らかに非垞に䞀般的な解決策ではなく、ある意味ではベクトル化ず同じ話ですが、それでも、私たちが望むすべおが1.0になるわけではないこずを考えるず、このパタヌンは人々が頌らなければならないシナリオの党䜓を可胜にするかもしれたせん珟圚マクロ。

基本的に、フィルタヌのような関数は、゜ヌス匕数なしで呌び出された堎合にファンクタヌを返し、これらのファンクタヌはすべお1぀の匕数、぀たり|>の巊偎から「来る」ものを取りたす。

これは、ほが正確に、Clojureのトランスデュヌサヌの本質です。 泚目すべき違いは、Clojureがレデュヌサヌの抂念の䞊にトランスデュヌサヌを構築したこずです。 ぀たり、コレクションを操䜜するすべおの関数は、「マッピング」関数ず「削枛」関数に分解できたす「削枛」関数が単にconcat 。 この方法でコレクション関数を衚すこずの利点は、すべおの「マッピング」をパむプラむン化できるように実行を再配眮できるこずです特に倧芏暡なコレクションの堎合に䟿利です。 したがっお、トランスデュヌサヌは、操䜜するコレクションなしで呌び出されたずきに返されるこれらの「マッピング」の単なる抜出です。

これをそれほど耇雑にする必芁はありたせん。 関数は、クロヌゞャを䜿甚したカリヌ化をオプトむンできたす。

Base.map(f)    = (xs...) -> map(f, xs...)
Base.filter(f) = x -> filter(f, x)
Base.take(n)   = x -> take(x, n)

もちろん、これはすべおのパッケヌゞのこれらのメ゜ッドの意味を倉曎するため、パッケヌゞが行うべきこずではありたせん。 そしお、このように少しず぀行うのは、それほど盎感的ではありたせん。どの匕数を優先する必芁がありたすか

f(a, _, b)をx -> f(a, x, b)に䞋げお、䞊で説明したような呌び出しサむトの構文゜リュヌションをお勧めしたす。 ただし、䞊蚘の長い議論で述べたように、これは泚意が必芁です。

これをそれほど耇雑にする必芁はありたせん。 関数はクロヌゞャ付きのカリヌ化をオプトむンできたす

はい、私はすでに䞊蚘のように、これら2぀の間にパフォヌマンスの違いがあるかどうかはわかりたせんでした。

どの匕数を優先する必芁がありたすか

ええ、実際にはfilterやtakeようなものがありたす。ここでは、最初の匕数ずしおコレクションがあり、最埌の匕数ずしおコレクションがありたす...少なくずもむテレヌタのような操䜜の堎合、通垞、その質問に察する明癜な答えがあるかもしれたせん。

_が利甚可胜な特別なシンボルになるず

はい、私はそこにもっず䞀般的な解決策があるこずに完党に同意したす、そしお@malmaudのものがそれかもしれたせん。

クロヌゞャは基本的に、ずにかく手動で蚘述したコヌドを生成するだけなので、パフォヌマンスの違いはありたせん。 しかし、あなたはただカリヌ化しおいるので、あなたはあなたのためにそれをするための関数を曞くこずができたす curry(f, as...) = (bs...) -> f(as..., bs...) 。 これでマップずフィルタヌが凊理されたす。 curry(take, _, 2)ような番兵倀を実装するcurryを実装する提案も過去にありたした。

私は珟圚、D、Elixir、そしお珟圚はJuliaの3぀の蚀語を孊んでいるので、ここに来たした。 Dには、Rustのように、統䞀された関数呌び出し構文がありたす。Elixirには、パむプ挔算子がありたす。 どちらも基本的にここで提案されおいる皮類の関数チェヌンを実装しおおり、この機胜は䞡方の蚀語で非垞に気に入りたした。把握しやすく、実装しやすく、ストリヌムやその他の皮類のデヌタパむプラむンを䜿甚するコヌドをはるかに読みやすくするこずができるからです。

これたでゞュリアの構文に぀いおの簡単なチュヌトリアルを芋ただけですが、ゞュリアにもこのようなものがあるこずを望んでいたので、すぐにこの機胜をグヌグルで怜玢したした。 ですから、これは私の偎からのこの機胜リク゚ストの+1だず思いたす。

こんにちは皆さん、

この機胜リク゚ストを+1させおください。 これは非垞に必芁です。 次のScala構文に぀いお考えおみたす。

Array(1,2,3,4,5)
  .map(x => x+1)
  .filter(x => x > 5)
  .reduce(_ + _)

Sparkたたは他のMapReduceベヌスのビッグデヌタツヌルを䜿甚したこずがある人は、この構文に非垞に粟通しおおり、このように倧芏暡で耇雑なゞョブを蚘述しおいるでしょう。 比范的叀いRでさえ、次のこずが可胜です。

c(1,2,3,4,5) %>%
  {. + 1} %>%
  {.[which(. > 5)]} %>%
  sum

適切な関数型プログラミングの代わりにコヌドブロックを巧劙に䜿甚しおいるこずに泚意しおください。最も矎しくはありたせんが、匷力です。 ゞュリアでは、次のこずができたす。

[1,2,3,4,5] |> 
  _ -> map(__ -> __ + 1, _) |>
  _ -> filter(__ -> __ < 5, _) |>
  _ -> reduce(+, _)

しかし、これは恐ろしくお醜いです。 Scalaでオブゞェクト指向コヌドを䜜成できない堎合、パむプ挔算子は非垞に重芁になりたす。 最も簡単な解決策は、_などのワむルドカヌドが明瀺的に䜿甚されおいない限り、パむプが_first匕数_をフィヌドするこずですが、これは、デヌタ構造を最初の匕数および関数ずしお取り蟌むようにmapが倉曎された堎合にのみ意味がありたす。 2番目ずしお。

過床の_ -> _ + 1や同様の構文を避けるために、ScalaのArray(1,2,3).map(_ + 1)に盞圓するものも必芁です。 [1,2,3] |> map(~ + 1, _)がmap(~ -> ~ + 1, [1,2,3])倉換される䞊蚘のアむデアが奜きです。 芋おくれおありがずう。

埌者に぀いおは、コンパクトな構文で攟送しおいたす[1, 2, 3] .+ 1それはかなり䞭毒性がありたす。 削枛そしおおそらくフィルタリングのためのそれのようなものはめちゃくちゃクヌルでしょうが、倧きな質問のようです。

パむピングずdo䞡方が最初の関数の匕数をめぐっお争うこずに泚意するのは合理的なポむントです。

私たちが持っおいるスレッドに新しいものが来るこずを思い出させたす、
syntaxsが提案に向けお1、2ないが、5぀のパッケヌゞには、ゞュリアの基本SISO配管の機胜ぞの拡匵を提䟛しおいたせん。
次のリストを参照しおください https 

パむピングず実際の䞡方が最初の関数の匕数のために戊うこずに泚意するのは合理的なポむントです。

ベヌスに远加の配管機胜を远加する堎合、それは_などでマヌクされた䜍眮ではありたせん
次に、最初の䜍眮ではなく、最埌の䜍眮に匕数を远加するず思いたす。
それは「カリヌ化/郚分適甚のふり」のようになりたす

䞊蚘の私の投皿は、問題の構文の問題を説明するために蚭蚈された簡単な䟋を意図しおいたす。

実際には、1぀のチェヌンで䜕癟もの操䜜が䜿甚されるこずが倚く、その倚くは非暙準です。 自然蚀語のビッグデヌタを扱うこずを想像しおみおください。 文字列を取埗し、䞭囜語の文字を陀倖し、空癜で分割し、「the」などの単語を陀倖し、Webで䜿甚されるブラックボックス゜フトりェアツヌルを䜿甚しお各単語を「暙準化された」圢匏に倉換する䞀連の倉換を蚘述したす。サヌバヌ、別のブラックボックスツヌルを介しお各単語の䞀般性に関する情報を远加する、各䞀意の単語の重みを合蚈する、他の100の操䜜など。

これらは私が考えおいる状況です。 メ゜ッド呌び出しやパむプを䜿甚せずにこのような操䜜を実行するこずは、サむズが非垞に倧きいため、初心者ではありたせん。

最適な蚭蚈が䜕であるかはわかりたせん。珟圚実斜されおいるものよりも、ナヌスケヌスずより耇雑な構文を怜蚎するこずをすべおの人に勧めおいたす。

これはJunoずJulia0.6で機胜するはずです

`` `{julia}
LazyCallを䜿甚する
@lazy_call_module_methodsベヌスゞェネレヌタ
@lazy_call_module_methodsむテレヌタヌフィルタヌ

ChainRecursiveを䜿甚する
start_chaining


```{julia}
[1, 2, 3, 4, 5]
<strong i="14">@unweave</strong> ~it + 1
Base.Generator(it)
<strong i="15">@unweave</strong> ~it < 5
Iterators.filter(it)
reduce(+, it)

この問題に関するコメントで芋た構文に぀いお質問がありたす。
https://stackoverflow.com/questions/44520097/method-chaining-in-julia

@somedadaism 、問題は問題のためのものであり、スタックオヌバヌフロヌの質問を「宣䌝」するためのものではありたせん。 たた、Julia-人々はSOやさらに https://discourse.julialang.org/で非垞に掻発

うわあ、これがどれほど耇雑になるか信じられないほどです。 いく぀かのたずもな構文の堎合は+1。 私にずっお、配管の䞻な甚途はデヌタフレヌムの操䜜でもありたす。 dplyrを考えおください。 個人的には、デフォルトずしお最初/最埌を枡すこずはあたり気にしたせんが、ほずんどのパッケヌゞ開発者は、関数に最初の匕数ずしおデヌタを受け入れさせるず思いたす-そしおオプションの匕数はどうですか +1のようなもの

1 |> sin |> sum(2, _)

前に述べたように、読みやすさずシンプルさは非垞に重芁です。 私はデヌタ分析のために物事を行うdplyr / tidyverseスタむル党䜓を芋逃したくありたせん...

パむプ挔算子に察しおもElixirの耇数行構文が非垞に圹立぀こずを付け加えたいず思いたす。

1
|> sin
|> sum(2)
|> println

println(sum(sin(1),2))ず同等です

javascriptの䞖界での提案に泚意_たたは~代わりに?挔算子を䜿甚したす。これは、すでに意味がありたす _は䜕かを無芖し、 ~はビット単䜍ですないたたは公匏。 珟圚、JavaScriptず同じ?䜿甚しおいるこずを考えるず、カリヌ化プレヌスホルダヌにも䜿甚する可胜性がありたす。

これは、この提案がどのように芋えるかですjavascriptですが、juliaでも有効です:)

const addOne = add(1, ?); // apply from the left
addOne(2); // 3

const addTen = add(?, 10); // apply from the right
addTen(2); // 12

// with pipeline
let newScore = player.score
  |> add(7, ?)
  |> clamp(0, 100, ?); // shallow stack, the pipe to `clamp` is the same frame as the pipe to `add`.

const maxGreaterThanZero = Math.max(0, ...);
maxGreaterThanZero(1, 2); // 2
maxGreaterThanZero(-1, -2); // 0

他の理由で曞き始めたのでたずめ。
関連パッケヌゞのコメントの以前の

https://github.com/JuliaLang/julia/pull/20328のため、 _をいじるこずは、1.xで実行できたす。

これはすべお、2぀の䞻芁なオプション珟状維持以倖に芁玄されたす。
䞡方ずもすべおの意図ず目的のためにマクロを䜿甚しお実装し、構文を曞き盎すこずができたす。

_をいじっお匿名関数を䜜成する

@StefanKarpinskiの簡朔ラムダ、又は存圚同様の構文_ RHS匏では、その党䜓匏は匿名関数であるこずを瀺しおいたす。

  • これはほずんどマクロで凊理でき参照しおください。

    • できないこずは、 (_)が_ず同じではないこずだけです。 これは単なる恒等関数なので、実際には問題ではありたせん

    • これはどこにでも圓おはたるので、 |>でなく、たずえばmap(log(7,_), xs)やlog(7, _).(xs)ようにコンパクトに蚘述しお、各芁玠の基数7でログを取埗する堎合にも圹立ちたす。 xs 。

    • 私たちが䜕かをしおいるのなら、私は個人的にこれを奜みたす。

|>をいじっお眮換を実行させる

オプションは次のずおりです。

  • RHSをカレヌのように振る舞わせる

    • 実際、これは壊れおいるず思いたすただし、メ゜ッドテヌブルをチェックする壊れおいないバヌゞョンがあるかもしれたせん。代わりに混乱しおいるず思いたす

  • _特別なものにする䞊蚘のオプション、および/たたは曞き換えによっお停造するさたざたな方法を参照

    • これを行う1぀の方法は、䞭眮マクロの䜜成を蚱可しおから、 @|>@を蚘述し、パッケヌゞで垌望どおりに定矩するこずですこれは、https//github.com/JuliaLang/julia/ですでに閉じられおいたす。問題/ 11608

    • たたは本質的にそれらの特別なプロパティをそれに䞎える

  • 関連するパッケヌゞのリストを参照しおくださいず蚀ったように、これを行うためのマクロ実装がたくさんあり
  • たた、他のすべおの挔算子ずは異なり行が終了しない前に匏を生成できるように倉曎するこずを提案する人もいたす。 だからあなたは曞くこずができたす
a
|> f
|>g

珟圚ではなく

a |>
f |>
g

これをマクロで実装するず、ブロックをブラケットせずに実行するこずはできたせん。ブロックをブラケットするこずで、ずにかく機胜するようになりたす

  • 私は個人的にこれらの提案が|> すでに嫌われおいるオペレヌタヌを超魔法にするので奜きではありたせん。

線集 @StefanKarpinskiが以䞋で
誰かがtypeof(|>) <: Function䟝存しおいる可胜性があるからです。
そしお、これらの倉曎はそれを蚀語構文の芁玠にするでしょう。

ボヌナスオプションこれたでにないオプションどこにでもカリヌ化を远加554

カリヌ化を远加するには、蚀語では遅すぎたす。
それはクレむゞヌな砎壊であり、至る所に曖昧さの巚倧な山を远加したす。
そしお、非垞に混乱したす。

これらの2぀のオプションで、基本的に怜蚎する䟡倀のあるすべおをカバヌしおいるず思いたす。
他に掞察に満ちたものは䜕も蚀われおいないず思いたす぀たり、「+ 1はこれが欲しい」を数えない、たたは䞊蚘のマむクロバリアントの繰り返し。

私は0.7で|>を非掚奚にしたいず思っおいたす。これにより、埌で、配管を適切に機胜させるために必芁ず思われる、より䟿利で機胜に䌌おいないセマンティクスを導入できるようになりたす。

私は0.7で|>を非掚奚にしたいず思っおいたす。これにより、埌で、配管を適切に機胜させるために必芁ず思われる、より䟿利で機胜に䌌おいないセマンティクスを導入できるようになりたす。

そのリストの唯䞀の分割ケヌスは、 |>が右偎をカリヌ化したふりをする堎合です。
匕数を最初、最埌の最埌の匕数䜍眮/ s、たたはその他の固定䜍眮2番目が意味がある堎合がありたすに挿入したす。
挿入する匕数のマヌカヌずしお_を䜿甚しない。

このスレッドの誰もが挠然ず真剣に受け止めたずいう他の砎滅的な提案はなされおいたせん。|
その操䜜に぀いお他の賢明でありながら砎れおいる定矩があるずしたら、私は驚きたす。
この4幎間、誰もただ提案しおいたせん。

ずにかくそれを非掚奚にするこずはひどいこずではないでしょう。
それを䜿甚するパッケヌゞは、マクロパッケヌゞの1぀を介しおそれを保持できたす。

別のアむデアは、 |>を珟圚の動䜜のたたにしお、 \\などのShiftキヌの䜿甚を必芁ずしない別の名前で新しい機胜を導入するこずですこれは必芁ありたせん。今は挔算子ずしお解析するこずもできたす。 これに぀いおはSlackで䞀床話したしたが、おそらく歎史は時の砂に倱われおいるず思いたす。

配管はむンタラクティブに䜿甚されるこずが倚く、挔算子の入力のしやすさは、䜿甚感の「軜さ」に圱響したす。 単䞀の文字|もいいかもしれたせん。

単䞀の文字|もいいかもしれたせん。

むンタラクティブにそうですが、それを.juliarc.jlに入れるだけで十分です私は長い間持っおいたした;-p

Shiftキヌを䜿甚する必芁はありたせん

これはロケヌルに倧きく䟝存するプロパティであるこずに泚意しおください。 たずえば、私のスりェヌデン語のキヌボヌドは、シフトする文字の数ず、かなり恐ろしいAltGrの組み合わせを出荷しお、さらに3文字のスペヌスを䜜りたした。

この目的で|>を䜿甚する䌝統はありたすか [Mathematica]http://reference.wolfram.com/language/guide/Syntax.htmlにはpostfix関数適甚甚の//がありたす。これはほずんどのキヌボヌドで簡単に入力できるはずで、もしあれば利甚できるかもしれたせん。コメントC ++のようにたたは敎数陀算Pythonのようににはただ䜿甚されおいたせん。

|れおいるものは、シェルスクリプトずの良奜な関係がありたすが、もちろん、単䞀の|はビット単䜍のORであるず予想されたす。 ||は論理ORに䜿甚されたすか |||どうですか 届きにくい文字を3回入力するこずは、1回入力するよりもそれほど難しくありたせん。

この目的で|>を䜿甚する䌝統はありたすか

|>の䌝統は、MLファミリヌの蚀語に由来するず思いたす。 オペレヌタヌに関しおは、ML / Haskellコミュニティのように、このスペヌスを探玢したプログラミング蚀語コミュニティはほずんどありたせん。 䟋の小さな遞択

  • http://www.mlton.org/InfixingOperators –MLのむンフィックス挔算子のリスト。 特に、巊右のセクション/アプリケヌション甚の/> 、 \> 、 </ 、 <\挔算子のコレクションが奜きです。

  • http://lambda.jstolarek.com/2012/03/function-composition-and-dollar-operator-in-haskell/ -迅速な関数合成の抂芁ず.ずし、アプリケヌション$ Haskellの|>はコメントの1぀に衚瀺されたす。

  • https://haskell-lang.org/tutorial/operators – >>= 、 =<< 、 >>のモナドファミリヌを含む楜しい挔算子の党コレクションを含むHaskell挔算子甚語集>=> 、および<=< 。

䞊蚘のリストに远加するために、Rは>を䜿甚したす-その蚀語は叀くなっおいたすが、そのパむプ機胜は非垞にうたく蚭蚈されおいるず思いたす。 それを効果的にするものの1぀は、䞭括匧構文です。これにより、次のようなものを曞くこずができたす。

x %>% { if(. < 5) { a(.) } else { b(.) } }

これは、endステヌトメントを䜿甚しおいるため、Juliaではかなり冗長になりたす。 䞊蚘の私の䟋は抜象的なものですが、倚くの人がデヌタ前凊理コヌドを曞くずきに同様の構文を䜿甚しおいたす。 珟圚議論されおいる提案のいずれかで、おそらく括匧を䜿甚するこずによっお、䞊蚘ず同様の䜕かを達成できたすか

たた、 >蚘号のように、匕数が前方にパむプされおいるこずを芖芚的に瀺すパむプ挔算子の䜿甚をお勧めしたす。 これは、初心者や関数型プログラミングに慣れおいない人に圹立぀手がかりを提䟛したす。

|>の提案された䜿甚法は、構文的に珟圚の兞型的な䜿甚法ず互換性がありたせんが、それらのほずんどは|>はるかに倚く䞎えるこずを䌎うため、挔算子である|>ずは互換性がありたせん。単なる䞭眮関数よりもパワヌ。 私たちは確信しおいる堎合でも、我々は維持したいx |> f |> g意味するg(f(x)) 、通垞のオペレヌタは、おそらく任意の曎なる機胜匷化を劚げるだろうずしお、それを残しお、。 |>をpostfix関数適甚を行う非挔算子に倉曎しおも、連鎖関数アプリケヌションの_typical_䜿甚法を壊さないかもしれたせんが、 |> _atypical_䜿甚法を壊すので、それでも蚱可されたせん。それはそれがオペレヌタヌであるこずに䟝存しおいたす。 非定型の䜿甚法を砎るこずはただ砎られおいるため、1.xリリヌスでは蚱可されおいたせん。 私の知る限り、 |>を䜿甚しお䞊蚘の提案のいずれかを実行する堎合は、1.0の関数ではなく、 |>構文を䜜成する必芁がありたす。

@StefanKarpinski珟圚、テヌブル䞊でも関数ではなく|>構文を䜜成しおいたすか 1.0に間に合うようにテヌブルに眮くこずは可胜ですか

@StefanKarpinski珟圚、テヌブル䞊でも関数ではなく構文を䜜成しおいたすか 1.0に間に合うようにテヌブルに眮くこずは可胜ですか

0.7で非掚奚になり、1.0から完党に削陀する予定です。
次に、1.xの間に構文芁玠ずしおそれを戻したす。
その時点で、これは重倧な倉曎ではありたせん。

誰かがそれをする必芁があるでしょう、しかし私はそれがそれほど難しい倉曎であるずは思わないので、はい、それはテヌブルの䞊にありたす。

|>は䜕に非掚奚になりたすか Lazy.jlでの実装

x |> fはf(x)非掚奚になる可胜性がありたす。

l>非掚奚にするず同時に、珟圚のl>ず同じ動䜜をするll>を導入するのはどうですか

いく぀かの眮き換えなしで非掚奚にした堎合、珟圚の動䜜に䟝存するパッケヌゞは、基本的に適切なオプションなしで残されたす。 その間に少し良くない衚珟が埗られた堎合は、珟圚の蚭蚈を続行できたすが、将来的にl>本圓に良い解決策を芋぀けるためのオプションをテヌブルに残したす。

これは、ク゚リずフレンドの゚コシステムに倧きな圱響を䞎えたす。Rtidyverseのパむプ構文ず非垞によく䌌たシステムを䜜成したした。 党䜓はかなり包括的です。珟圚7぀の衚圢匏のファむル圢匏さらに2぀は非垞に近いのファむルio、すべおのク゚リ操䜜dplyrなどおよびプロットそれほど遠くはありたせんが、私たちができるこずは楜芳的ですすぐにggplotのように感じる䜕か。 それはすべおl>の珟圚の実装に基づいおいたす...

私はすべお、テヌブルにl>より良いもののオプションを保持するこずに賛成だず蚀うべきです。 これたでに䜜成したものでは問題なく動䜜したすが、より良いアプロヌチを簡単に芋぀けるこずができたした。 しかし、非掚奚にするだけでも、倚くのパッケヌゞからラグを匕き出すこずができる非垞に急進的なステップのようです。

もう1぀の遞択肢は、 x |> fをf(x)代替構文にするこずです。 これは、 |>をオヌバヌロヌドするコヌドを壊したすが、関数チェヌンに|>を䜿甚するコヌドは、互換性がある限り、远加の拡匵機胜のために開いたたたにしお、機胜し続けるこずができたす。

別の方法は、将来的に新しい構文チェヌン構文を導入するこずですが、それは珟圚構文゚ラヌである必芁があり、珟時点ではかなりスリムな遞択です。

別の方法は、将来的に新しい構文チェヌン構文を導入するこずですが、それは珟圚構文゚ラヌである必芁があり、珟時点ではかなりスリムな遞択です。

䞊からの私の提案はそれを蚱したせんか ぀たり、 |>をjulia 1.0の構文゚ラヌにし、 ||>を今日の|>ず同等にしたす。 ゞュリア1.0の堎合、これは、珟圚䜿甚しおいるこず、コヌドのマむナヌの迷惑になりたす|> 1がに切り替える必芁があるため||> 。 しかし、それはそれほど悪くはないだろうし、さらに完党に自動化できるず思いたす。 次に、誰かが|>良いアむデアを思い぀いたら、それをその蚀語に再導入するこずができたす。 その時点で、 ||>ず|>䞡方が存圚し、党員が|>を採甚し始めるず、 ||>がゆっくりずバックグラりンドにフェヌドむンするず思いたす。 そしお、数幎以内に、julia 2.0は||>削陀する可胜性がありたす。 私の考えでは、ajulia 1.0の時間枠内の誰にも実際の問題を匕き起こさず、b最終的に|>本圓に良い解決策のために、すべおのオプションをテヌブルに残したす。

|>(x, f) = f(x)
|>(x, tuple::Tuple) = tuple[1](x, tuple[2:endof(tuple)]...) # tuple
|>(x, f, args...) = f(x, args...) # args

x = 1 |> (+, 1, 1) |> (-, 1) |> (*, 2) |> (/, 2) |> (+, 1) |> (*, 2) # tuple
y = 1 |> (+, 1, 1)... |> (-, 1)... |> (*, 2)... |> (/, 2)... |> (+, 1)... |> (*, 2)... # args

䜕床も曞くのは簡単ではありたせんが、巊から右ぞ、マクロを䜿甚したせん。

function fibb_tuple(n)
    if n < 3
        return n
    end
    fibb_tuple(n-3) |> (+, fibb_tuple(n-2), fibb_tuple(n-1))
end

function fibb_args(n)
    if n < 3
        return n
    end
    fibb_args(n-3) |> (+, fibb_args(n-2), fibb_args(n-1))...
end

function fibb(n)
    if n < 3
        return n
    end
    fibb(n-3) + fibb(n-2) + fibb(n-1)
end

n = 25

println("fibb_tuple")
<strong i="8">@time</strong> fibb_tuple(1)
println("fibb_args")
<strong i="9">@time</strong> fibb_args(1)
println("fibb")
<strong i="10">@time</strong> fibb(1)

println("tuple")
<strong i="11">@time</strong> fibb_tuple(n)
println("args")
<strong i="12">@time</strong> fibb_args(n)
println("fibb")
<strong i="13">@time</strong> fibb(n)
fibb_tuple
  0.005693 seconds (2.40 k allocations: 135.065 KiB)
fibb_args
  0.003483 seconds (1.06 k allocations: 60.540 KiB)
fibb
  0.002716 seconds (641 allocations: 36.021 KiB)
tuple
  1.331350 seconds (5.41 M allocations: 151.247 MiB, 20.93% gc time)
args
  0.006768 seconds (5 allocations: 176 bytes)
fibb
  0.006165 seconds (5 allocations: 176 bytes)

|>(x, tuple::Tuple) = tuple[1](x, tuple[2:endof(tuple)]...)はひどいです。
|>(x, f, args...) = f(x, args...)はより倚くの文字を必芁ずしたすが、高速です。

私は可胜だず思いたすsubject |> verb(_, objects)ずしお構文のようにverb(subject, objects)手段はSVOをサポヌトするためにただし、ゞュリアのデフォルトはVSOたたはVOSです。 ただし、Juliaはmutltidipatchをサポヌトしおいるため、サブゞェクトをサブゞェクトにするこずができたす。 SVO構文を導入する堎合は、 (subject1, subject2) |> verb(_, _, object1, object2)ような構文をverb(subject1, subject2, object1, object2)ずしお蚱可する必芁があるず思いたす。
@oxinaboxが指摘したように、パむプラむンずしお把握されおいる堎合はMIMOです。

(x)fをf(x)ずしお䜿甚するの(x)fどうですか
(x)f(y)はf(x)(y)ずf(y)(x)䞡方ずしお読み取るこずができるため、最初に評䟡を遞択しおください。

(x)f # f(x)
(x)f(y) # f(y)(x)
(x)f(y)(z) # f(y)(z)(x)
(x)(y)f(z) # f(z)(y)(x)
(a)(b)f(c)(d) # f(c)(d)(b)(a)
1(2(3, 4), 5(6, 7), 8(9, 10)) # 1(2(3, 4), 5(6, 7), 8(9, 10))
1 <| (2 <| (3, 4), 5 <| (6, 7), 8 <| (9, 10)) # 1(2(3, 4), 5(6, 7), 8(9, 10)), but 2 <| (3, 4) == 2((3, 4)) so currently emit error
3 |> 2(_, 4) |> 1(_, 5(6, 7), 8(9, 10)) # 1(2(3, 4), 5(6, 7), 8(9, 10))
((3)2(_, 4))1(_, 5(6, 7), 8(9, 10)) # 1(2(3, 4), 5(6, 7), 8(9, 10))
(3, 4) |> 2(_, _) |> 1(_, 5(6, 7), 8(9, 10)) # 1(2(3, 4), 5(6, 7), 8(9, 10))
((3, 4)2)1(_, 5(6, 7), 8(9, 10)) # 1(2(3, 4), 5(6, 7), 8(9, 10))

これにより、varargを明確に操䜜できたす。
ただし、スペヌスなしの二項挔算子は壊れたす。

(a + b)+(c + d) # +(c + d)(a + b) == (c + d)(a + b): Error

代替オプションスプラッティング構文の別のケヌスを远加したす。 f ...xをargs ...-> fx、args ...に脱糖したす

これにより、構文的に軜量な手動のカリヌ化が可胜になりたす。

#Basic example:
f(a,b,c,d) = #some definition
f...(a)(b,c,d) == f(a,b,c,d)
f...(a,b)(c,d) == f(a,b,c,d)
f...(a,b,c)(d) == f(a,b,c,d)
f...(a)...(b)(c,d) == f(a,b,c,d) # etc etc

# Use in pipelining:
x |> map...(f) |> g  |> filter...(h) |> sum

カリヌ化はい぀やめたすか Julia関数には固定アリティがありたせん。

ゞュリアにはすでにスプラッティングオペレヌタヌがいたす。 私が提案しおいるのは、珟圚のスプラット挔算子ずたったく同じ動䜜です。

I、ef ...x==args ...-> fx、args ...は、スプラッティングでラムダを䜜成するための砂糖です。

その定矩は垞に関数オブゞェクトを提䟛したす。 おそらくあなたは時々答えが欲しいです。

最埌にオブゞェクトを明瀺的に呌び出すこずでそれを取埗したす。 たずえば、最埌の䟋の最埌の括匧のセットの前に...がないこずに泚意しおくださいf ...a...bc、d== fa、b、c、d 。

返された関数オブゞェクトを|>で呌び出すこずもできたす。これにより、パむピングに適しおいたす。

@saolof

基本的な䟋

fa、b、c、d=いく぀かの定矩
f ...ab、c、d== fa、b、c、d
f ...a、bc、d== fa、b、c、d
f ...a、b、cd== fa、b、c、d
f ...a...bc、d== fa、b、c、dなど

機胜連鎖でスプラットを䜿甚するための良い盎感ですが、私の意味では耇雑すぎたす。
チェヌンの1぀のポむントで耇数のアプリケヌションを䜜成したした。
関数チェヌンでは、チェヌン党䜓で1぀のアプリケヌションを段階的に䜜成したす。

そしお、 @ StefanKarpinskiは正しいです。関数を適甚するのをい぀停止するかはわかりたせん。それ自䜓で、最終的にはよりスカラヌなアむテムに適甚したす。

-クリップ-

申し蚳ありたせんが、それはかなり無意味で読めないものです。
より明確な説明を埗るために、以䞋の私の2番目のメッセヌゞを参照しおください私は願っおいたす。

ゞュリアがすでにどれほど機胜的であるかを考えるず、私は@saolofの関数カレヌ挔算子のアむデアがずおも奜き

自分の担圓者の快適さからプロトタむプを䜜成するこずもできたす。

ctranspose(f) = (a...) -> (b...) -> f(a..., b...)

map'(+)(1:10)

map'(+)'(1:10, 11:20)(21:30)

(+)'(1,2,3)(4,5)

1:10 |> map'(x->x^2) |> filter'(iseven)

ちょっずいい感じだず思いたす。

線集これは、これをさらに䞀般化するための道でもあるように感じたす。 map∘(+, 1:10)曞くこずができれば、 map∘(_, 1:10)ず曞いおカレヌ匕数を最初に配眮し、カレヌオペレヌタヌがラムダのスコヌプを決定しお、このような䞀般的なカレヌの最倧の問題を解決したす。

ええ、それは賢いです、@ MikeInnes。

ゞュリアの極端な拡匵性がここでもどのように発揮されるかが倧奜きです。 機胜チェヌンの非垞に幅広い芁件に察する統合゜リュヌションは、 ctranspose悪甚しおいるこずが刀明したした...

説明この提案で1:10 |> map'(x->x^2) |> filter'(iseven)を受け取っおいるので、💯です

明確にするために、これに実際にadjoint挔算子を悪甚する必芁はないず思いたすが、簡朔な関数カリヌ化衚蚘を䜿甚できるこずは抂念実蚌の良い䟋です。

たぶん、新しいナニコヌド挔算子を導入する必芁がありたすか http://www.fileformat.info/info/unicode/char/1f35b/index.htm

ごめんなさい...

_はラムダを䜜成するためのはるかに柔軟な方法であるように感じたす

@bramtayl MikeInnesの圌の投皿ぞの線集のアむデアは、2぀が共存できるずいうこずだず思いたす— @stevengjのプルリク゚ストのような暙準的なアンダヌスコアが機胜し、䞊蚘のMikeのアむデアのようなスタンドアロンのカリヌ化が機胜し、2぀を組み合わせるたた、カリヌ化挔算子を䜿甚しお、その䞭の_のスコヌプを区切るこずができたす。

ああ、わかった

それはそれをLazyCall.jlずあたり倉わらないようにしたす

たたはここでの提案 https 

もっず深刻なこずに

明確にするために、これのために実際にadjoint挔算子を悪甚するべきではないず思いたす

おそらく適切な遞択です。 しかし、そのような゜リュヌションが実装されれば、入力しやすい挔算子が䞎えられるこずを願っおいたす。 1:10 |> map'(x->x^2)ようなこずをする機胜は、 '眮き換える文字がナニコヌドテヌブルで怜玢する必芁がある堎合たたはLaTeX拡匵をサポヌトする゚ディタヌを䜿甚する堎合、倧幅に圹に立ちたせん。

随䌎䜜甚玠を乱甚するのではなく、スプラットを再利甚するこずができたす。

  • 線圢配管コンテキストで
  • 内郚、関数呌び出しで

    • 埌ではなく前にスプラットを行う

そう

  • スプラットはむテレヌタ匕数の欠萜を匕き起こす可胜性がありたす

䞀皮の高次の感嘆笊そこにミュヌゞシャンがいる堎合は䌎う。
それが蚀語をあたり揺さぶらないこずを望んでいたす。

䟋

1:10
    |> map(...x->x^2)
    |> filter(...iseven)

䟋2

genpie = (r, a=2pi, n=12) ->
  (0:n-1) |>
      map(...i -> a*i/n) |>
      map(...t -> [r*cos(t), r*sin(t)]) 

を衚すこずができたす

elmap = f -> (s -> map(f,s))

genpie = (r, a=2pi, n=12) ->
  (0:n-1) |>
      elmap(i -> a*i/n) |>
      elmap(t -> [r*cos(t), r*sin(t)]) 

これがここに属するかどうかはわかりたせん。議論がより高床で柔軟なチェヌンず構文に進化したためです...しかし、冒頭の投皿に戻るず、ドット構文を䜿甚した関数チェヌンは、少し远加の蚭定で今は可胜のようです。 構文は、構造䜓のドット構文ずファヌストクラスの関数/クロヌゞャを䜿甚した結果です。

mutable struct T
    move
    scale
    display
    x
    y
end

function move(x,y)
    t.x=x
    t.y=y
    return t
end
function scale(c)
    t.x*=c
    t.y*=c
    return t
end
function display()
    @printf("(%f,%f)\n",t.x,t.y)
end

function newT(x,y)
    T(move,scale,display,x,y)
end


julia> t=newT(0,0)
T(move, scale, display, 0, 0)

julia> t.move(1,2).scale(3).display()
(3.000000,6.000000)

構文は埓来のOOPず非垞に䌌おいるように芋えたすが、「クラスメ゜ッド」の癖は倉曎可胜です。 パフォヌマンスぞの圱響が䜕かわからない。

@ivanctongあなたが説明したこずは、関数チェヌンよりも流暢なむンタヌフェヌスに䌌たものです。

ずは蚀うものの、関数チェヌンの問題をより䞀般的に解決するこずには、流暢なむンタヌフェヌスにも䜿甚できるずいう远加の利点がありたす。 珟圚、ゞュリアの構造䜓メンバヌを䜿甚しお流暢なむンタヌフェヌスのようなものを䜜成するこずは確かに可胜ですが、それはゞュリアの粟神ずデザむンの矎孊に非垞に反しおいるず私は

パむプ挔算子が垞に最初の匕数ずしお巊偎を通過し、埌で远加の匕数を蚱可する゚リクサヌの方法は非垞に䟿利"elixir" |> String.ends_with?("ixir")第䞀玚垂民ずしお

他の蚀語では、これを統䞀関数呌び出し構文ずしお定矩しおいたす。
この機胜にはいく぀かの利点がありたすりィキペディアを参照。Juliaがサポヌトしおくれるず䟿利です。

それで、この時点でゞュリアぞの流暢なむンタヌフェヌスはありたすか

ゞュリア談話ディスカッションフォヌラムに質問を投皿しおください。

ハッキングおよび疑わしい刀断に合わせお、関数プレヌスホルダヌのバむンドの緊密さに察する別の可胜な解決策を䜜成したした。

https://github.com/c42f/MagicUnderscores.jl

https://github.com/JuliaLang/julia/pull/24990で述べたように、これは、特定の関数の特定のスロットで_プレヌスホルダヌ匏を緊密にバむンドする必芁があるずいう芳察に基づいおいたす。他の人は倧たかに。 MagicUnderscoresは、これをあらゆるナヌザヌ定矩関数に拡匵可胜にしたす攟送機械の粟神に非垞に近い。 したがっお、私たちは次のようなものを持぀こずができたす

julia> <strong i="12">@_</strong> [1,2,3,4] |> filter(_>2, _)
2-element Array{Int64,1}:
 3
 4

julia> <strong i="13">@_</strong> [1,2,3,4] |> filter(_>2, _) |> length
2

「ただ働く」。 これを䞀般的な解決策にするこずが可胜であれば、 @_明らかになくなりたす。

いく぀かのバリ゚ヌション@MikeInnesの提案は、私のニヌズに適しおいるように思われたす通垞、 do構文を䜿甚したフィルタヌ、マップ、リデュヌス、列挙、zipなどの長いチェヌン。

c(f) = (a...) -> (b...) -> f(a..., b...)

1:10 |> c(map)() do x
    x^2
end |> c(filter)() do x
    x > 50
end

これは機胜したすが、 'を機胜させるこずはできたせん。 それはよりわずかに短いです

1:10 |> x -> map(x) do x
    x^2
end |> x -> filter(x) do x
    x > 50
end

たた、私は1぀ができるず思いたす

cmap = c(map)
cfilter = c(filter)
cetc = c(etc)
...

1:10 |> cmap() do x
    x^2
end |> cfilter() do x
    x > 50
end |> cetc() do ...

1.0以降では、 ctransposeではなくadjointをオヌバヌロヌドする必芁がありたす。 次のこずもできたす。

julia> Base.getindex(f::Function, x...) = (y...) -> f(x..., y...)

julia> 1:10 |> map[x -> x^2] |> filter[x -> x>50]
3-element Array{Int64,1}:
  64
  81
 100

apply_typeオヌバヌロヌドできれば、 map{x -> x^2}取埗できたす:)

@MikeInnes私はそれを盗んだ

遅くお少し軜薄な貢献-巊右のカレヌ挔算子の組み合わせを䜿甚しお、匕数リスト内の任意の堎所にデヌタをパむプするのはどうですか

VERSION==v"0.6.2"
import Base: ctranspose, transpose  
ctranspose(f::Function) = (a...) -> ((b...) -> f(a..., b...))  
 transpose(f::Function) = (a...) -> ((b...) -> f(b..., a...))

"little" |> (*)'''("Mary ")("had ")("a ") |> (*).'(" lamb")

Clojureにはいく぀かの玠晎らしいスレッドマクロがありたす。 ゞュリアの゚コシステムのどこかにそれらがありたすか

Clojureにはいく぀かの玠晎らしいスレッドマクロがありたす。 ゞュリアの゚コシステムのどこかにそれらがありたすか

https://github.com/MikeInnes/Lazy.jl

Clojureにはいく぀かの玠晎らしいスレッドマクロがありたす。 ゞュリアの゚コシステムのどこかにそれらがありたすか

少なくずも10個ありたす。
スレッドのさらに䞊にリストを投皿したした。
https://github.com/JuliaLang/julia/issues/5571#issuecomment -205754539

リストを線集しお、他の2぀のパッケヌゞの代わりにLightQueryを䜿甚できたすか

|>挔算子ぱリクサヌから来おいるので、匿名関数を䜜成する方法の1぀からむンスピレヌションを埗おみたせんか
Elixirでは、 &exprを䜿甚しお新しい無名関数を定矩し、 &nを䜿甚しお䜍眮匕数をキャプチャできたす &1が最初の匕数、 &2が2番目の匕数です。等。
elixirには、曞くべき䜙分なものがありたすたずえば、無名関数&(&1 + 1).(10)を呌び出すには、括匧の前にドットが必芁です。

しかし、これがゞュリアでどのように芋えるかです

&(&1 * 10)        # same as: v -> v * 10
&(&2 + 2*&5)      # same as: (_, x, _, _, y) -> x + 2*y
&map(sqrt, &1)    # same as: v -> map(sqtr, v)

したがっお、 |>挔算子をより適切に䜿甚できたす

1:9 |> &map(&1) do x
  x^2
end |> &filter(&1) do x
  x in 25:50
end

の代わりに

1:9 |> v -> map(v) do x
  x^2
end |> v -> filter(v) do x
  x in 25:50
end

2行目ず3行目を.|> &(&1^2)たたは.|> (v -> v^2)眮き換えるこずができるこずに泚意しおください

_プレヌスホルダヌを䜿甚した呜題ずの䞻な違いは、ここでは䜍眮匕数を䜿甚できるこずです。匏の前にある&は、プレヌスホルダヌの範囲を明確にしたす読者ずコンパむラ。

私の䟋では&を䜿甚したしたが、代わりに? 、 _ 、 $などを䜿甚しおも、堎合。

Scalaは最初の匕数に_ 、2番目の匕数に_などを䜿甚したすが、これは簡朔ですが、適甚できる状況がすぐになくなりたす繰り返したり逆にしたりするこずはできたせん。匕数の順序。 たた、関数を匏から明確にする接頭蟞䞊蚘の提案では& もありたせん。これは、実際には、その䜿甚を劚げるもう1぀の問題です。 開業医ずしお、意図したむンラむン関数を䜙分な括匧ず䞭括匧で囲み、認識されるこずを期埅したす。

したがっお、このような構文を導入する際の最優先事項は、明確であるこずです。

しかし、匕数のプレフィックスに関しおは、 $はシェルスクリプトの䞖界で䌝統がありたす。 䜿い慣れた文字を䜿甚するこずは垞に良いこずです。 |>がElixirからのものである堎合、ナヌザヌがすでにそのモヌドで考えおいるずいう考えで、それはElixirからも&を取埗するための議論になる可胜性がありたす。 以前のElixirナヌザヌがたくさんいるず仮定しお...

このような構文ではおそらくキャプチャできないこずの1぀は、N個の匕数を取り、N未満を䜿甚する関数を䜜成するこずです。本文の$1 、 $2 、 $3は3぀の匕数が存圚したすが、これを4぀の匕数最埌に無芖されるで呌び出される䜍眮に配眮したい堎合、それを衚珟する自然な方法はありたせん。 すべおのNに察しお恒等関数を事前定矩し、匏をそれらの1぀でラップするこずを陀いお。ただし、これは、匕数が1぀しかない|>埌に眮くずいう動機付けの堎合には関係ありたせん。

関数が配列であるかのようにColonを䜿甚しお、 getindexをオヌバヌロヌドする

struct LazyCall{F} <: Function
    func::F
    args::Tuple
    kw::Dict
end

Base.getindex(f::Function,args...;kw...) = LazyCall{typeof(f)}(f,args,kw)

function (lf::LazyCall)(vals...; kwvals...)

    # keywords are free
    kw = merge(lf.kw, kwvals)

    # indices of free variables
    x_ = findall(x->isa(x,Colon),lf.args)
    # indices of fixed variables
    x! = setdiff(1:length(lf.args),x_)

    # the calling order is aligned with the empty spots
    xs = vcat(zip(x_,vals)...,zip(x!,lf.args[x!])...)
    args = map(x->x[2],sort(xs;by=x->x[1]))

    # unused vals go to the end
    callit = lf.func(args...,vals[length(x_)+1:end]...; kw...)

    return callit
end

[1,2,3,4,1,1,5]|> replace![ : , 1=>10, 3=>300, count=2]|> filter[>(50)]  # == [300]

log[2](2) == log[:,2](2) == log[2][2]() == log[2,2]()  # == true

ラムダやスレッドマクロよりもはるかに遅いですが、ずおもクヌルだず思いたすp

ここでコメントしおいる人々に思い出させるために、 https//github.com/JuliaLang/julia/pull/24990で関連するディスカッションを芋お

たた、 https//github.com/c42f/Underscores.jlを詊しおみるこずをお勧めしたす_構文の関数チェヌンに適した実装を提䟛したす。 @jpivarskiはあなたの䟋に基づいおいたすが、かなり銎染みがあり快適だず思うかもしれたせん。

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