å
ã®èšäº
-JavaScriptã䜿çšãã Monadã® çè§£ ïŒ
IonuÈ G. Stan ïŒã
PMã®ç¿»èš³ã®ãšã©ãŒ/ã¿ã€ããã¹/äžæ£ç¢ºãã«ã€ããŠã®ã³ã¡ã³ãã«æè¬ããŸãã
èè
ãã
é廿°é±éãç§ã¯ã¢ãããçè§£ããããšããŠããŸããã ç§ã¯ãŸã Haskellãå匷ããŠãããççŽã«èšã£ãŠãç§ã¯ãããäœã§ããããç¥ã£ãŠãããšæããŸããããå°ããªã©ã€ãã©ãªãæžããããšæã£ããšã-ãã¬ãŒãã³ã°ã®ããã«-ç§ã¯ã¢ããã®
bind (>>=)
ã©ã®ããã«åããçè§£ããŠããŸãããããŠ
return
ã§ãããç¶æ
ãã©ãããæ¥ãã®ãããããŸããã ã ããããããããç§ã¯ããããã¹ãŠã©ã®ããã«æ©èœãããçè§£ããŠããªãã ãã®çµæãJavascriptãäŸãšããŠäœ¿çšããŠã¢ãããååŠç¿ããããšã«ããŸããã
Y Combinatorãæšæž¬ãããšãã®èšç»ã¯åãã§ãããæåã®ã¿ã¹ã¯ïŒããã§ã¯æç€ºçã«äžå€ã®ç¶æ
ãšã®çžäºäœçšã§ãïŒãåããå
ã®ã³ãŒããæ®µéçã«å€æŽããªãããœãªã¥ãŒã·ã§ã³ã«é²ã¿ãŸããã
Javascriptãéžæããã®ã¯ãç°¡æœãªæ§æãŸãã¯ããŸããŸãªã»ãã³ãã£ã¯ã¹ïŒã©ã ãåŒãæŒç®åãçµã¿èŸŒã¿é¢æ°ã®ã«ãªãŒåïŒã®ãããã§Haskellãæçšã«é ããã¹ãŠãæžãããšã匷å¶ããããã§ãã ãããŠæåŸã«ãç§ã¯æ¯èŒããã®ãäžæãªã®ã§ãCoffeeScriptãšSchemeã§ããã®åé¡ã解決ããŸãããã³ãŒãã¹ãããããžã®ãªã³ã¯ã¯æ¬¡ã®ãšããã§ãã
å¶éäºé
ãã®èšäºã§ã¯ãèªåèªèº«ãç¶æ
ã®ã¢ããã«éå®ããŸããããã¯ãäžè¬çã«ã¢ãããšã¯äœããçè§£ããã®ã«ååã§ãã å¶éäºé
ã¯æ¬¡ã®ãšããã§ãã
- å¯å€ç¶æ
ãªã
Haskellã¯å¯å€ç¶æ
ãæããªããããã¢ããã䜿çšããŸãã
- æãããªæ¡ä»¶ãªã
å¯å€ç¶æ
ããªãå Žåãçµæã®ç¶æ
ãã©ãã«ã§ã匷å¶çã«æž¡ãå¿
èŠããããŸãã ãã®ãããªã³ãŒããæžãããèªãã ãããã®ã¯æ¥œããããšã§ã¯ãããŸããããã¢ããã¯ãã®ãããã¹ãŠé ããŸãïŒå°ãåŸã§ãããã§ãããïŒã
- ã³ãŒãã®éè€ãªã
ãã®çºèšã¯åã®çºèšãšé£åããŸãããéè€ããã³ãŒããåé€ããããšã¯æ°ããé«ããæ¢çŽ¢ããããã®åŒ·åãªããŒã«ã§ãããããç§ã¯ãŸã åå¥ã«è¡ããŸãã
ã ãã¬ãã«ããã¢ã·ã«
èšäºã¯éåžžã«è±å¯ã§ããããšã倿ããããã远å ã®è³æã远å ãããšãããšæãã以äžã«èª¬æãããã¹ãŠã®æé ãå«ãçããããªãé²ç»ããŸããã ããã¯tl; drããŒãžã§ã³ã«äŒŒãŠããã説æãããŠãããã¹ãŠã®ãã©ã³ãžã·ã§ã³ã衚瀺ããã®ã«åœ¹ç«ã¡ãŸããããããªãèŠãã®ã¯èšäºãèªãã§ããªããšããŸã圹ã«ç«ã¡ãŸããã
HDã§å©çšã§ãã
Vimeoã§çŽæ¥èŠèŽããããšããå§ãããŸãã
å®éšãŠãµã®
ã¹ã¿ãã¯ã¯ç°¡åã«çè§£ã§ããæ§é ã«ãªã£ãŠãããéåžžã®å®è£
ã§ã¯ç¶æ
倿Žã䜿çšãããããã¹ã¿ãã¯ããã¹ã察象ãšããŠäœ¿çšããŸãã Javascriptã¹ã¿ãã¯ã®éåžžã®å®è£
æ¹æ³ã¯æ¬¡ã®ãšããã§ãã
var stack = []; stack.push(4); stack.push(5); stack.pop();
Javascriptã®é
åã«ã¯ãã¹ã¿ãã¯ã«è¡šç€ºããããšäºæ³ããããã¹ãŠã®ã¡ãœãã
push
ããã³
pop
ãŸãã ç§ãå«ããªã®ã¯ã圌ãã圌ãã®ç¶æ
ãå€ãããšããããšã§ãã ãŸããå°ãªããšããã®èšäºã§ã¯å¥œãã§ã¯ãããŸããã
説æããåã¹ãããã¯æ©èœããŠããŸãã ãã©ãŠã¶ã³ã³ãœãŒã«ãéããŠãã®ããŒãžãæŽæ°ããã ãã§ããè¡
5 : 4
ã°ã«ãŒããããã€ã衚瀺ãããŸãã ãã ããèšäºã®æ¬æã§ã¯ãåã®æé ãšæ¯èŒãã倿Žç¹ã®ã¿ãåŒçšããŸãã
æç€ºçãªç¶æ
åŠçãåããã¹ã¿ãã¯
ç¶æ
ã®å€æŽãé¿ããããã®æãããªè§£æ±ºçã¯ã倿Žããšã«æ°ããç¶æ
ãªããžã§ã¯ããäœæããããšã§ãã Javascriptã§ã¯ãããã¯æ¬¡ã®ããã«ãªããŸãã
ã芧ã®ãšããã
pop
ãš
push
ã¯çµæã®ã¹ã¿ãã¯ãè¿ããŸãã
pop
ã¯ãã¹ã¿ãã¯ã®æäžéšããã®å€ãè¿ããŸãã åŸç¶ã®åã¹ã¿ãã¯æäœã§ã¯ã以åã®ããŒãžã§ã³ã®ã¹ã¿ãã¯ã䜿çšãããŸãããæ»ãå€ã®è¡šçŸã®éãã«ãããããã¯ããã»ã©æç¢ºã§ã¯ãããŸããã æ»ãå€ãæ£èŠåããããšã«ãããã³ãŒãã®è€è£œã匷åã§ããŸãã
var push = function (element, stack) { var value = undefined; var newStack = [element].concat(stack); return { value: value, stack: newStack }; }; var pop = function (stack) { var value = stack[0]; var newStack = stack.slice(1); return { value: value, stack: newStack }; }; var stack0 = []; var result0 = push(4, stack0); var result1 = push(5, result0.stack); var result2 = pop(result1.stack);
ããã¯ãåè¿°ã®ã³ãŒãã®è€è£œãšåãã§ãã è€è£œãæç€ºçãªç¶æ
転éãæå³ããŸãã
ç¶ç¶è»¢éã®ã¹ã¿ã€ã«ã§ã³ãŒããæžãæããŸã
次ã«ããããã®äžéçµæã颿°åŒã³åºãã«çœ®ãæããŸããåçŽãªå€æ°ããã颿°ããã©ã¡ãŒã¿ãŒãæœè±¡åããæ¹ãç°¡åã ããã§ãã ãããè¡ãã«ã¯ãã¹ã¿ãã¯æäœã®çµæã«æž¡ããã
ç¶ç¶ãåã«é©çš
bind
ãã«ããŒé¢æ°ãäœæããŸãã ã€ãŸããç¶ç·šãã¹ã¿ãã¯æäœã«
ãã€ã³ãããŸãã
var bind = function (value, continuation) { return continuation(value); }; var stack0 = []; var finalResult = bind(push(4, stack0), function (result0) { return bind(push(5, result0.stack), function (result1) { return bind(pop(result1.stack), function (result2) { return bind(pop(result2.stack), function (result3) { var value = result2.value + " : " + result3.value; return { value: value, stack: result3.stack }; }); }); }); });
finalResult
ã§è¿ãããåŒå
šäœã®å€ã¯ãåäžã®
push
ãŸãã¯
pop
æäœã®å€ãšåãåã§ãã äžè²«ããã€ã³ã¿ãŒãã§ãŒã¹ãå¿
èŠã§ãã
push
ã¢ã³ãpop
次ã«ã
bind
åŒæ°ãé ã
bind
æž¡ããããã¹ã¿ãã¯åŒæ°ã
push
ããã³
pop
ããåãé¢ãå¿
èŠããããŸãã
ãããè¡ãã«ã¯ã
ã«ãªãŒåãšåŒã°ããå¥ã®ã©ã ãèšç®ã®ããªãã¯ã䜿çšã
ãŸã ã èšãæããã°ã颿°ã®äœ¿çšã®å
å»¶ã°ããšåŒã¶ããšãã§ããŸãã
ããã§ã
push(4, stack0)
ãåŒã³åºã代ããã«ã
push(4)(stack0)
ãåŒã³åºããŸãã Haskellã§ã¯ã颿°ãæ¢ã«ã«ãªãŒåãããŠããããããã®æé ã¯å¿
èŠãããŸããã
var push = function (element) { return function (stack) { var value = undefined; var newStack = [element].concat(stack); return { value: value, stack: newStack }; }; }; var pop = function () { return function (stack) { var value = stack[0]; var newStack = stack.slice(1); return { value: value, stack: newStack }; }; }; var stack0 = []; var finalResult = bind(push(4)(stack0), function (result0) { return bind(push(5)(result0.stack), function (result1) { return bind(pop()(result1.stack), function (result2) { return bind(pop()(result2.stack), function (result3) { var value = result2.value + " : " + result3.value; return { value: value, stack: result3.stack }; }); }); }); });
äžéã¹ã¿ãã¯ãæž¡ãããã®bind
æºå
åã®éšåã§è¿°ã¹ãããã«ã
bind
ãæç€ºçãªã¹ã¿ãã¯ã§åŒæ°ã«æž¡ããããšæããŸãã ãããè¡ãã«ã¯ããŸãã
bind
ãæåŸã®ãã©ã¡ãŒã¿ãŒãšããŠã¹ã¿ãã¯ãåãããã«ããŸãããã«ãªãŒåããã颿°ã®åœ¢åŒãã€ãŸã
bind
ãã¹ã¿ãã¯ãåŒæ°ãšããŠåã颿°ãè¿ãããã«ããŸãã ãŸãã
push
ãš
pop
éšåçã«é©çšãããããã«ãªããŸãããã€ãŸããã¹ã¿ãã¯ãçŽæ¥æž¡ãããšã¯ãªããªãã
bind
ããããå®è¡ããããã«ãªããŸããã
var bind = function (stackOperation, continuation) { return function (stack) { return continuation(stackOperation(stack)); }; }; var stack0 = []; var finalResult = bind(push(4), function (result0) { return bind(push(5), function (result1) { return bind(pop(), function (result2) { return bind(pop(), function (result3) { var value = result2.value + " : " + result3.value; return { value: value, stack: result3.stack }; })(result2.stack); })(result1.stack); })(result0.stack); })(stack0);
æåŸã«ã¹ã¿ãã¯ãåé€ããŸã
ããã§ã
bind
ã倿ŽããŠ
stackOperation
颿°ã®æ»ãå€ãè§£æããããããã¹ã¿ãã¯ã
stackOperation
ã¹ã¿ãã¯ã
stackOperation
颿°ã§ããç¶ç¶ã«
stackOperation
ããšã«ãããäžéã¹ã¿ãã¯ãé衚瀺ã«ã§ããŸãã ãŸããæ»ãå€
{ value: value, stack: result3.stack }
ãå¿å颿°ã§ã©ããããå¿
èŠããããŸãã
var bind = function (stackOperation, continuation) { return function (stack) { var result = stackOperation(stack); var newStack = result.stack; return continuation(result)(newStack); }; }; var computation = bind(push(4), function (result0) { return bind(push(5), function (result1) { return bind(pop(), function (result2) { return bind(pop(), function (result3) { var value = result2.value + " : " + result3.value;
æ®ãã®ã¹ã¿ãã¯ãé衚瀺ã«ããŸã
åã®å®è£
ã§ã¯ãããã€ãã®äžéã¹ã¿ãã¯ãé ããŠããŸããããæçµå€ãè¿ã颿°ã«å¥ã®äžéã¹ã¿ãã¯ã远å ããŸããã å¥ã®ãã«ããŒé¢æ°
result
èšè¿°ããããšã«ããããã®ã¹ã¿ãã¯ãã¬ãŒã¹ãé衚瀺ã«ã§ããŸãã ããã«ãããã«ãããä¿åããŠããç¶æ
ã®ãã¥ãŒãé衚瀺ã«ãªã
stack
ãš
stack
2ã€ã®ãã£ãŒã«ããæã€æ§é äœã
var result = function (value) { return function (stack) { return { value: value, stack: stack }; }; }; var computation = bind(push(4), function (result0) { return bind(push(5), function (result1) { return bind(pop(), function (result2) { return bind(pop(), function (result3) { return result(result2.value + " : " + result3.value); }); }); }); }); var stack0 = []; var finalResult = computation(stack0);
ããã¯ããŸãã«Haskellã®
return
颿°ãè¡ãããšã§ãã èšç®çµæãã¢ããã«ã©ããããŸãã ç§ãã¡ã®å Žåãããã¯ã¹ã¿ãã¯ããšãã¯ããŒãžã£ãŒã§çµæãã©ããããŸããããã¯æ£ç¢ºã«å¯å€ç¶æ
ãæã€èšç®ã®ã¢ããã§ã-ãã®ç¶æ
ããšã颿°ã§ãã èšãæããã°ã
result/return
å€ã¯ãæž¡ãããå€ã®åšãã®ç¶æ
ã§æ°ããã³ã³ããã¹ããäœæãããã¡ã¯ããªé¢æ°ãšããŠèª¬æã§ããŸãã
ç¶æ
ãå
éšã«ãã
push
颿°ãš
pop
颿°ã«ãã£ãŠè¿ãããæ§é ãèªèããããã«
ç¶ç¶ããå¿
èŠã¯ãããŸãããããã¯å®éã«ã¢ããã®å
éšã衚ããŸãã ãããã£ãŠã
bind
ã倿ŽããŠãå¿
èŠãªæå°ããŒã¿ã®ã¿ãã³ãŒã«ããã¯ã«è»¢éããŸãã
var bind = function (stackOperation, continuation) { return function (stack) { var result = stackOperation(stack); return continuation(result.value)(result.stack); }; }; var computation = bind(push(4), function () { return bind(push(5), function () { return bind(pop(), function (result1) { return bind(pop(), function (result2) { return result(result1 + " : " + result2); }); }); }); }); var stack0 = []; var finalResult = computation(stack0);
ã¹ã¿ãã¯èšç®ãå®è¡ãã
ã¹ã¿ãã¯äžã®æäœãçµã¿åãããããšãã§ããããããããã®èšç®ãå®è¡ããŠçµæã䜿çšããå¿
èŠããããŸãã ããã¯äžè¬ã«ã¢ããè©äŸ¡ãšåŒã°ããŸãã Haskellã§ã¯ã倿°ç¶æ
èšç®ã¢ããã¯ããããèšç®ããããã®3ã€ã®é¢æ°
runState
ã
evalState
ããã³
execState
ãŸãã
ãã®èšäºã®ç®çäžã
State
ãµãã£ãã¯ã¹ã
Stack
眮ãæããŸãã
æçµçãªèšç®å€
evalStack
ãå¿
èŠãªå Žåã¯ã
evalStack
ãå¿
èŠã§ãã ã¢ããèšç®ãéå§ããæçµç¶æ
ãç Žæ£ããŠèšç®å€ãè¿ããŸãã ãã®é¢æ°ã䜿çšããŠãã¢ããã³ã³ããã¹ãããå€ãåŒãåºãããšãã§ããŸãã
ã¢ããããè±åºã§ããªããšèããããšããããªããããã¯IOã¢ããã®ãããªå°æ°ã®å Žåã«ã®ã¿åœãŠã¯ãŸããšèšããŸãã ããããããã¯å¥ã®è©±ã§ããäž»ãªããšã¯ãã¹ããŒããã«ã³ã³ãã¥ãŒãã£ã³ã°ã®ã¢ããããæãåºãããšãã§ãããšããããšã§ãã
å®äº
ããªãããŸã ç§ãšäžç·ã«ãããªããç§ã¯ãããJavascriptã®ã¢ããã®ããã«èŠãããšèšãã§ãããã Haskellã»ã©ã¯ãŒã«ã§èªã¿ããããã®ã§ã¯ãããŸããããç§ãã§ããæåã®æ¹æ³ã§ãã
ã¢ããã¯ãæžãã¹ãå
容ãã»ãšãã©ç€ºããŠããªããããããªãæœè±¡çãªæŠå¿µã§ãã åºæ¬çã«ã圌女ã¯ãããã€ãã®åŒæ°ïŒå¯å€ç¶æ
ã®ã¢ããã®å Žåã¯ç¶æ
ïŒãš2ã€ã®è¿œå ã®é¢æ°
result
ãš
bind
ãåã颿°ãäœæããå¿
èŠããããšèšããŸãã 1ã€ç®ã¯ãäœæãã颿°ã®ãã¡ã¯ããªãŒãšããŠæ©èœãã2ã€ç®ã¯ãã¢ããã«é¢ããå¿
èŠãªããŒã¿ã®ã¿ãå€éšã®äžçã«æäŸããã¢ããã«ãã£ãŠèšç®ãããå€ãåãåã
ç¶ç¶ã䜿çšããŠãç¶æ
ãæž¡ããªã©ã®ãã¹ãŠã®éå±ãªäœæ¥ãè¡ããŸãã ã¢ããã®äžã«ããã¹ããã®ã¯ãã¹ãŠå
éšã«æ®ããŸãã OOPãšåãããã«ãã¢ããã®ã²ãã¿ãŒ/ã»ãã¿ãŒãäœæããããšãã§ããŸãã
ãããã³ã«ã®å ŽåãHaskellã§ã®
computation
ã¯æ¬¡ã®ããã«ãªããŸãã
computation = do push 4 push 5 a <- pop b <- pop return $ (show a) ++ " : " ++ (show b)
Haskellã§èŠæ ããè¯ããªãäž»ãªçç±ã¯ã
do
èšæ³ã®åœ¢åŒã§æ§æã¬ãã«ã§ã¢ããããµããŒããã
do
ã§ãã ããã¯ãJavascriptã®å ŽåãããèŠæ ãã®è¯ãããŒãžã§ã³ã®åãªãç ç³ã§ãã Haskellã¯ãæŒç®åã®ãªãŒããŒã©ã€ããšç°¡æœãªã©ã ãåŒã®ãµããŒãã®ãããã§ãããèªã¿ãããã¢ããã®å®è£
ãå®è£
ã§ããŸãã
computation = push 4 >>= \_ -> push 5 >>= \_ -> pop >>= \a -> pop >>= \b -> return $ (show a) ++ " : " ++ (show b)
Haskellã§ã¯ã
>>=
ã¯JavaScriptã§
bind
ãšåŒã°ãã
return
ã¯
result
ãšåŒã°ããŸãã ã¯ããHaskellã§ã®
return
ã¯ããŒã¯ãŒãã§ã¯ãªã颿°ã§ãã ãã®ä»ã®å Žåã
return
ã¯
unit
ããªãŒã ãã§ãã ãã©ã€ã¢ã³ããªãã¯ã¯
ãClojureã®ã¢ããã«é¢ããåç»ã§
>>=
決å®è
ãåŒã³åºããŸããã ãããã£ãŒããã¡ããã圌ã¯
return
ãåŒã³åºããŸã
return
ã
JavaScriptã®å°ããªç ç³
å®éããã«ããŒé¢æ°
sequence
ã䜿çšããŠãJavaScriptã§ã¢ããèšç®ãè¡ãæ¹ãã¯ããã«åªããŠã
sequence
ã Javascriptã®åçãªæ§è³ªã«ããã
sequence
ã¯ä»»æã®æ°ã®åŒæ°ãåãããšãã§ããŸãããããã®åŒæ°ã¯ãé£ç¶ããŠå®è¡ããå¿
èŠãããã¢ããæŒç®ã§ãããæåŸã®åŒæ°ã§ã¯ãã¢ããã¢ã¯ã·ã§ã³ã®çµæã«å¯ŸããŠå®è¡ããå¿
èŠãããã¢ã¯ã·ã§ã³ã§ãã ã¢ããèšç®ã®æªå®çŸ©ã®çµæã¯ãã¹ãŠããã®ã³ãŒã«ããã¯ã«è»¢éãããŸãã
var sequence = function (/* monadicActions..., continuation */) { var args = [].slice.call(arguments); var monadicActions = args.slice(0, -1); var continuation = args.slice(-1)[0]; return function (stack) { var initialState = { values: [], stack: stack }; var state = monadicActions.reduce(function (state, action) { var result = action(state.stack); var values = state.values.concat(result.value); var stack = result.stack; return { values: values, stack: stack }; }, initialState); var values = state.values.filter(function (value) { return value !== undefined; }); return continuation.apply(this, values)(state.stack); }; }; var computation = sequence( push(4),
Real World Haskellã®æ¬ã®èè
ã¯ãã¢ãããšããã°ã©ã å¯èœãªã»ãã³ãã³ãæ¯èŒããŠããŸãã ãã®å ŽåããœãããŠã§ã¢ãšãã¥ã¬ãŒããããã³ã³ãããã
sequence
ãããã¯ã
sequence
å
ã®ã¢ããã¢ã¯ã·ã§ã³ãåé¢ããããã«äœ¿çšããããã§ãã
é
å»¶èšç®ãšããŠã®ã¢ãã
ã¢ãããã³ã³ãã¥ãŒãã£ã³ã°ãåŒã³åºãããšãããè³ã«ããŸããã æåã¯çç±ãããããŸããã§ããã 圌ãã¯èšãããšãã§ããã圌ãã¯ç°ãªãããšãèšç®ããããã圌ãã¯èšãããããã誰ãèšãïŒãã¢ããã¯èšç®ãããã圌ãã¯éåžžããã¢ããã¯èšç®ããããšèšãã ãã©ããèšäºã宿ãããåŸããããäœãæå³ããã®ããããããçè§£ããŸããïŒãŸãããŸãã¯çè§£ãããšæããŸãïŒã ãããã®äžé£ã®ã¢ã¯ã·ã§ã³ãšå€ã¯ãæç€ºããããŸã§äœãèšç®ããŸããã ããã¯ãåæç¶æ
ã§ã®åŒã³åºãåŸã«å®è¡ã§ãããéšåçã«é©çšããã颿°ã®åçŽãªå€§ããªãã§ãŒã³ã§ãã 以äžã«äŸã瀺ããŸãã
var computation = sequence( push(4), push(5), pop(), pop(), function (pop1, pop2) { return result(pop1 + " : " + pop2); } );
ãã®ã³ãŒãã¯ãå®è¡åŸã«äœããèšç®ããŸããïŒ ãã
runStack
ã
evalStack
ãŸãã¯
execStack
ã䜿çšããŠå®è¡ããå¿
èŠããããŸãã
var initialStack = []; evalStack(computation, initialStack);
push
ãš
pop
ã¯ããçš®ã®ã°ããŒãã«ãªå€ã«äœçšããŠããããã«èŠããŸãããå®éã«ã¯ããã®å€ãæž¡ããããšåžžã«åŸ
æ©ããŸãã ãããèšç®ã®ã³ã³ããã¹ããšããŠäœ¿çšããã®ã¯ãOOPã®ããã§ãã ç§ãã¡ã®å Žåãããã¯ã«ãªãŒåãšéšåçãªã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠå®è£
ãããååŒã®æ°ããã³ã³ããã¹ããæããŸãã ãŸããOOPã§ã³ã³ããã¹ããæé»çãšåŒã°ããå Žåãã¢ããã䜿çšãããšãããã«æé»çïŒååšããå ŽåïŒã«ãªããŸãã
ã¢ããïŒããã³äžè¬çãªé¢æ°åããã°ã©ãã³ã°ïŒã®å©ç¹ã¯ãç°¡åã«çµã¿åããå¯èœãªãããã¯ãåŸãããããšã§ãã ãããŠãããã¯ãã¹ãŠã«ã¬ãŒã®ãããã§ãã 2ã€ã®ã¢ããã¢ã¯ã·ã§ã³ãé£ç¶ããŠå®è¡ããããã³ã«ãå®è¡ãåŸ
æ©ããŠããæ°ãã颿°ãäœæãããŸãã
var computation1 = sequence( push(4), push(5), pop(), pop(), function (pop1, pop2) { return result(pop1 + " : " + pop2); } ); var computation2 = sequence( push(2), push(3), pop(), pop(), function (pop1, pop2) { return result(pop1 + " : " + pop2); } ); var composed = sequence( computation1, computation2, function (a, b) { return result(a + " : " + b); } ); console.log( evalStack(composed, []) );
ããã¯ãã¹ã¿ãã¯ã§æäœãå®è¡ãããšãã«ã¯ã»ãšãã©åœ¹ã«ç«ããªãããã«æãããããããŸããããããšãã°ãããŒãµãŒã³ã³ãããŒã¿ã®ã©ã€ãã©ãªãèšèšãããšããéåžžã«åœ¹ç«ã¡ãŸãã ããã«ãããã©ã€ãã©ãªäœæè
ã¯ãããŒãµãŒã¢ããã«ããã€ãã®ããªããã£ã颿°ã®ã¿ãæäŸã§ããã©ã€ãã©ãªãŠãŒã¶ãŒã¯å¿
èŠã«å¿ããŠãããã®ããªããã£ããæ··åããæçµçã«çµã¿èŸŒã¿DSLã«ã¢ã¯ã»ã¹ã§ããŸãã
çµãã
ãã®èšäºãã圹ã«ç«ãŠã°å¹žãã§ãã ãã®ã¹ãã«ïŒããã³ç¿»èš³-
çŽPer ïŒã¯ãééããªãã¢ããã®çè§£ãåäžãããã®ã«åœ¹ç«ã¡ãŸããã
åç
§è³æ
æ¬
èšäºãšææž
æ å