Anyã§ä»»æã®é¢æ°ãåŒã³åºããŠãå€ãæåã®ãã©ã¡ãŒã¿ãŒãšããŠé¢æ°ã«æž¡ãããå€ã§é¢æ°åŒã³åºãã«æž¡ããããã©ã¡ãŒã¿ãŒãåŸã§è¿œå ãããããã«ããããšã¯å¯èœã§ããããïŒ
äŸ
sum(a::Int, b::Int) -> a + b
a = 1
sum(1, 2) # = 3
a.sum(2) # = 3 or
1.sum(2) # = 3
å®è¡æã®äŸå€ãåé¿ããããã«é¢æ°ãè¿ããã®ã決å®è«çãªæ¹æ³ã§ç€ºãããšã¯å¯èœã§ããïŒ
.
æ§æã¯éåžžã«äŸ¿å©ãªã®ã§ãé¢æ°åŒã³åºãã®åãªãå矩èªã«ããã€ããã¯ãããŸããã 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ã« Lazy.jlã«@as>
ãå®è£
ããããšãã§ããŸãã@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
ã|>
ãããã£ãŠçœ®æãå®è¡ããããªãã·ã§ã³ã¯æ¬¡ã®ãšããã§ãã
_
ç¹å¥ãªãã®ã«ããïŒäžèšã®ãªãã·ã§ã³ãããã³/ãŸãã¯æžãæãã«ãã£ãŠåœé ããããŸããŸãªæ¹æ³ãåç
§ïŒ@|>@
ãèšè¿°ããããã±ãŒãžã§åžæã©ããã«å®çŸ©ããããšã§ãïŒããã¯ãhttpsïŒ//github.com/JuliaLang/julia/ã§ãã§ã«éããããŠããŸãïŒãåé¡/ 11608ïŒa
|> f
|>g
çŸåšã§ã¯ãªãïŒ
a |>
f |>
g
ïŒããããã¯ãã§å®è£ ãããšããããã¯ããã©ã±ããããã«å®è¡ããããšã¯ã§ããŸããããããã¯ããã©ã±ããããããšã§ããšã«ããæ©èœããããã«ãªããŸãïŒ
|>
ïŒãã§ã«å«ãããŠãããªãã¬ãŒã¿ãŒïŒãè¶
éæ³ã«ããã®ã§å¥œãã§ã¯ãããŸãããç·šéïŒ @StefanKarpinskiã以äžã§
誰ããtypeof(|>) <: Function
äŸåããŠããå¯èœæ§ãããããã§ãã
ãããŠããããã®å€æŽã¯ãããèšèªæ§æã®èŠçŽ ã«ããã§ãããã
ã«ãªãŒåãè¿œå ããã«ã¯ãèšèªã§ã¯é
ãããŸãã
ããã¯ã¯ã¬ã€ãžãŒãªç Žå£ã§ãããè³ãæã«ææ§ãã®å·šå€§ãªå±±ãè¿œå ããŸãã
ãããŠãéåžžã«æ··ä¹±ããŸãã
ãããã®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ã«ã¯ããã€ãã®çŽ æŽãããã¹ã¬ãããã¯ãããããŸãã ãžã¥ãªã¢ã®ãšã³ã·ã¹ãã ã®ã©ããã«ãããããããŸããïŒ
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ã¯ããªãã®äŸã«åºã¥ããŠããŸãããããªã銎æã¿ãããå¿«é©ã ãšæããããããŸããã
æãåèã«ãªãã³ã¡ã³ã
ã ããç§ãã¡ã®çŸåšã®ããŸããŸãªåãçµã¿ã®ãªã¹ããªã©
ãããããã§ãã¯ãã䟡å€ããããšæããŸãïŒçæ³çã«ã¯æèŠãè¿°ã¹ãåã§ãããw / eïŒ
ãããã¯ãã¹ãŠãããã«ç°ãªããŸãã
ïŒç§ã¯å¹Žä»£é ã«æ³šæããããšããŠããŸãïŒã
ããã±ãŒãž
éããã±ãŒãžãããã¿ã€ã
é¢é£ïŒ
ãããããããã¯ãããã®æçš¿ã®1ã€ã«ç·šéããå¿ èŠããããŸãã
æŽæ°æ¥ïŒ2020-04-20