ããã£ã¨ããããã«ãªã¼åãã§ç´¹ä»ãããnanto_viãããkilreyãããKENZããã®ã³ã¼ãã¯ãããããã©ã ãå¼ã«ããã«ãªã¼åã®è¡¨ç¾ã¨æ£ãã対å¿ãã¦ãã¾ããæåããã©ã ãè¨ç®ã§èããã°ããã£ããããªãã§ãããªãã¨ã«æ°ãä»ããªããã ï¼ãã¨è¨ããããã§ãããããã¯ã§ããï¼ åã¿ããã«å¾ç¥æµã§çå±ãããããã¿ã¬ã¨ãç´è¦³ã§å¤æãã¦ãæ£ããçµæãå¾ãã¨ãã¹ãã¼ãã®éãã§ããããããã¹ãå¦çã®æ¹æ³ãæãã¤ãããããã®ã¾ã¾ç¡åçã«ãã£ã¦ãã¾ã£ãããåã¯ãï¼ï¼å®ã¯èé«ééã ã
ã§ã以ä¸ãå¾ç¥æµã§ãã¿ã¬çå±ããã¾ããã³ãã³ãã§ã
å 容ï¼
- JavaScriptããfunctional風çä¼¼è¨èªã¸
- å¤å¤æ°é¢æ°ã®ã©ã ãè¨ç®ï¼ æ§æã®å®ç¾©
- ããããã¦ã«ãªã¼åã®å®ç¾©
- ã©ã ãè¨ç®è¦åã¨è¨ç®ä¾
- curry颿°ãã«ãªã¼åã«ãªã£ã¦ãããã¨
- è£è¶³ã¾ãã¯èè¶³
èªåçã«ã¯ãå¼ã®ã¢ã¼ãã£ã³ã°ããã£ã³ã«é¢ç½ãã
âJavaScriptããfunctional風çä¼¼è¨èªã¸
JavaScriptã¨ã©ã ãå¼ã®ç¸äºç¿»è¨³ãããã«ã¯ãåæ¹ããæ©ã¿å¯ããå¿ è¦ã§ããã¾ããJavaScriptã®å¤§å颿°ã ãèãã¦ãè¨æ³ã颿°åè¨èªã«è¿ã¥ãã¦ã¿ã¾ãã
äºä¾ã¨ãã¦ãnanto_viããã®curry颿°ï¼
function curry(func)
{
return function (first) {
return function () {
var args = Array.prototype.concat.apply([first], arguments);
return func.apply(this, args);
};
};
}
ããã§ãArray.prototype.concat.apply([first], arguments);
ã¨ãããããæå·§çãªè¡¨ç¾ãããã®ã§ãputfirstã¨ãã颿°ãå°å
¥ãã¦ããã¾ããããã§ãvar args = putfirst(first, arguments);
ã¨æ¸ãæããã¾ãã
returnãåãé¤ãã¦ã夿°ããããã¨ã次ã®ãããªæãããã¡ããããã®æ®µéã§çä¼¼è¨èªï¼å®å¨ããªãï¼ã«ãªã£ã¦ãã¾ãã¾ããï¼
curry(func) :=
function (first) {
function () {
func.apply(this, putfirst(first, arguments));
}
}
ãããapplyã¯ã¡ã½ããã®ã¾ã¾ã§ããã大å颿°applyã«ç´ãã¾ããapplyã®ç¬¬ä¸å¼æ°ãï¼å¤§å颿°ã ãæ±ããªãï¼ä¸è¦ãããã¨ãç¹æ®ãªå¤æ°ã§ããargumentsã弿°ã®å½¢ã«ããã°ã次ã®ããã«ãªãã¾ãï¼
curry(func) :=
function (first) {
function arglist {
apply(func, putfirst(first, [arglist]));
}
}
function arglist
ã®ããã«æ¸ããã¨ããarglistã¯å¼æ°ä¸¦ã³ã§ããã[arglist]
ã¯ä¸¦ã³ãé
åã«ã¾ã¨ãããã®ã¨ãã¾ãã
âå¤å¤æ°é¢æ°ã®ã©ã ãè¨ç®ï¼ æ§æã®å®ç¾©
ã©ã ãè¨ç®ãå°ãæç´ããã¾ãããã¨ãã¨ãã©ã ãè¨ç®ã¯1夿°ï¼1弿°ï¼é¢æ°ã®è¨ç®ä½ç³»ã§ãããããããã«ãªã¼åã®åºçªããªãã®ã§ãf(x, y, z) ã®ãããªè¡¨ç¾ãèªããããã«å¤æ´ãã¾ããã¾ããè¤åãã¼ã¿ã¨ãã¦é åãå°å ¥ãã¾ãããã
ãããªæ¹éã§ã以ä¸ã«ã©ã ãå¼ï¼ã©ã ãé ï¼ã®æ§æãå®ç¾©ãã¾ãï¼
- 夿°åã¨é¢æ°åã¯æåããåºå¥ãã¦ããã¾ãï¼ãã®ã»ãã話ãç°¡åã«ãªãã®ã§ï¼ã夿°ã¯ãã¢ã«ãã¡ãããå¾åã®è±å°æåã¨æ°åãããªãååãx, y, x1ãªã©ã颿°ã¯ãf, g, foo ãªã©ã
- 夿°ï¼åï¼ã颿°ï¼åï¼ã¯ããã ãã§é ã§ãã
- é åã¯ã[é 1, é 2, ...] ã®å½¢ãé åãé ã§ãã
- 並ã³ï¼é åã¨ã¯éãï¼ã¯ã(é 1, é 2, ...) ã®å½¢ã並ã³ã¯è£å©ç表ç¾ã§ãããèªä½ã¯é ã§ã¯ããã¾ããã
- 颿°é©ç¨ã¯ã颿°ï¼ã表ãé ï¼Fã¨ä¸¦ã³AããF A ã¨ç©ºç½ãã¯ããã§ä¸¦ã¹ãå½¢ãããã¾ãããªãåºåãããªã空ç½ãå ¥ããªãã¦ãOKã颿°é©ç¨ã¯é ã§ãã
- Xã夿°ä¸¦ã³ãMãé ã®ã¨ããλX.M ã¯é ã§ãã
- ã¾ã¨ã¾ããä»ããããã«ã«ãã³ã使ã£ã¦ãã¾ãã¾ãããå³å¯ã«ã¯ä¸¦ã³ãä½ãã«ãã³ã¨å¥ãªè¨å·ãå¿ è¦ã§ãããã(ãã)ããäºéã®ç¨æ³ã§ä½¿ã£ã¦ãã¾ãï¼ã©ã£ã¡ã®ç¨æ³ãã¯æèã§å¤æï¼ã
- 颿°ã§ã¯ãªã宿°ï¼ä¾ï¼1, "hello", nullï¼ã¯å¿ è¦ãªã ãå°å ¥ãã¦ãã¾ãã¾ããã
é ã®ä¾ã¯ãx, sum, sum(x, 1), mean3(a, b, sum(x, 1)), (curry(sum))(10)(y) ãªã©ãå®ã¯ããã ãã§ã¯ãæ§æçã«æ£ããé ãå¤å®ã§ãã¾ãããããã®è©±ã®åã«ãã¡ã¿è¨å·ã®ä½¿ãæ¹ã説æãã¦ããã¾ãã
- X, Y ãªã©ã¯å¤æ°ä¸¦ã³ã表ãã¡ã¿å¤æ°ãF, Gãªã©ã¯é¢æ°çé ã表ãã¡ã¿å¤æ°ãM, Nãªã©ã¯ä¸è¬çãªé ã表ãã¡ã¿å¤æ°ãA, Bãªã©ã¯ä¸¦ã³ã表ãã¡ã¿å¤æ°ã¨ãã¦ä½¿ãã¾ãã
- x, yãªã©ã¯ãè¨ç®ä½ç³»å ã®å¤æ°ã¨ãã¦ãã夿°ã表ãã¡ã¿å¤æ°ã¨ãã¦ã使ãã¾ããåæ§ã«ãf, gãªã©ã颿°ï¼æåããããè¨å·ï¼ã表ãã¡ã¿å¤æ°ã¨ãã¦ã使ãã¾ããï¼ã»ãã¨ã¯åä½ãå¤ãã¦åºå¥ãã¹ãã ããé¢åã ããããï¼
- Aã並ã³ã®ã¨ããLength(A)ã¯Aã®é·ãã表ãã¾ãã
- Mãé ãA=[A1, ..., An]ã並ã³ã®ã¨ããM@A 㯠[M, A1, ..., An]ã表ãã¾ãã
- A=[A1, ..., An]ãB=[B1, ..., Bm]ã並ã³ã®ã¨ããA#B 㯠[A1, ..., An, B1, ...,Bm]ã表ãã¾ãã
ããã«ãé ã®ã¢ãªãã£ï¼arity; 弿°ã®åæ°ï¼ã次ã®ããã«å®ç¾©ãã¾ãã
- 颿°ï¼åï¼ã«ã¯ãæåããã¢ãªãã£ãå®ãããã¦ãããã¢ãªãã£ã®å¤ã¯0以ä¸ã®æ´æ°ã§ãããï¼è¤æ°ã®ã¢ãªãã£ã許ãã»ãã便å©ã§ãããè¤éã«ãªãããããã¾ãããï¼
- Arity(λX.M) = Length(X)
- 夿°ãé åã宿°ï¼é颿°ï¼ã«ã¢ãªãã£ã¯å®ç¾©ãããªãã
ããã§ãæ§æçã«æ£ãã颿°é©ç¨ãå®ç¾©ã§ãã¾ãã
- Arity(F) = Length(A) ã®ã¨ãã ãã颿°é©ç¨ F A ã¯æ£ããæ§æã
Arity(sum) = 2, Arity(mean3) = 3 ã ã¨ããã°ãsum(x, y), mean3(a, b, c), curry(sum)(10)(y) ã¯æ£ããé ã§ããλ(x, y).mean3(x, b, y) ãæ£ããé ã§ããã®ã¢ãªãã£ã¯2ã§ããã(λ(x).sum(x, 1))(y, 10) ã¯ã¢ãªãã£ä¸ä¸è´ã§ãã¡ã
以ä¸ãããªãã¤ã³ãã©ã¼ãã«ãªå®ç¾©ã§ãããã¾ã¼ããããããã§ããã§ããããå®ãè¨ãã¨ãã¡ã¿å¤æ°ï¼X, Fãªã©ï¼ï¼ã¡ã¿é¢æ°ï¼Lengthãªã©ï¼ï¼ã¡ã¿æ¼ç®åï¼@ã¨#ï¼ãå«ãè¨ç®ä½ç³»ãå½¢å¼çï¼formalï¼ã«å®ç¾©ããã»ãããããã©ãããããã¾ã¼é¢åã ãããããã
âããããã¦ã«ãªã¼åã®å®ç¾©
ãgãfã®ã«ãªã¼åã§ããããã¨ã¯ã次ã®ãã¨ã§ãã
f(x, y) = g(x)(y)
ä¸è¬åãã¦ãYã(y1, ..., yn)ã®ãããªä¸¦ã³ã ã¨ãã¦ã
f x@Y = g(x) Y
x@Y = x@(y1, ..., yn) = (x, y1, ..., yn) ãg(x) Y = g(x)(y1, ..., yn) ã§ãããã¨ã«æ³¨æããã¼ãèããã¨ãã=ãã®ä½¿ãæ¹ã䏿ã§ããããå¼ï¼é ï¼ã¨ãã¦åãå½¢ããããã«è§£éãã¦ãã ããã
ãã£ã¨ä¸è¬åããã¨ãX = (x1, ..., xm), Y = (y1, ...,yn)ã®ãããªç¶æ³ã§ï¼
f X#Y = g X Y
âã©ã ãè¨ç®è¦åã¨è¨ç®ä¾
念ã®ãããã©ã ãå¼ï¼é ï¼ã®è¨ç®è¦åï¼ãã¼ã¿éå ï¼ãè¿°ã¹ã¾ãï¼ã¢ã«ãã¡å¤æã¯çç¥ï¼ãå¥ã«ãããçè§£ããªãã¦ããå®éã®è¨ç®ã¯ç´è¦³çã«ã§ããã¨æãã¾ãã
- [ãã¼ã¿è¦å] (λ(x1, ...,xm).M)(N1, ..., Nm) â M[N1/x1, ..., Nm/xm]
ããã¨ãããã¤ãã®é åæ¼ç®ã¯ããªããã£ãã¨ãã¦æåããæºåãã¦ããã¾ããããæ¢ã«åºç¾ããapply, concat, putfirst ã¯ããªããã£ããé åã®ã³ã³ã¹ãã©ã¯ã¿arrayãæåããå ¥ãã¦ããã¾ããarrayã®ã¢ãªãã£ãåé¡ã«ãªãã¾ãããä¾å¤çã«å¯å¤ã¢ãªãã£ã許ãã¾ããããããã ãã¯ã以ä¸ã«è¨ç®è¦åï¼
- [applyè¦å] apply(F, array A) â F A
- [concatè¦å] concat(array A, array B) â array A#B
- [putfirstè¦å] putfirst(M, array A) â array M@A
ã¡ã¿æ¼ç®ã§ãã ' 'ï¼ç©ºç½ï¼é¢æ°é©ç¨ï¼ã'#'ï¼ä¸¦ã³é£æ¥ï¼ã'@'ï¼ä¸¦ã³ã«è¿½å ï¼ã«å¯¾å¿ãã颿°ï¼è¨å·ï¼ã applyãconcatãputfirstãªããã§ããããã¦ãarrayã¯ä¸¦ã³ãé åã«å¤æãã¾ãï¼ã¡ã¿ã¬ãã«ããªãã¸ã§ã¯ãã¬ãã«ã«è½ã¨ãï¼ã
ãããè¨ç®ä¾ããªãã¹ãå¤å´ããè¨ç®ããæ¦ç¥ã§ï¼
(λ(a, x).apply(mean3, putfirst(a, array(b, apply(sum, array(x, 1))))))(sum(y, z), 10)
â // by ãã¼ã¿è¦å
apply(mean3, putfirst(sum(y, z), array(b, apply(sum, array(10, 1)))))
â // by putfirstè¦å
apply(mean3, array(sum(y, z), b, apply(sum, array(10, 1))))
â // by applyè¦åï¼å¤å´ï¼
mean3(sum(y, z), b, apply(sum, array(10, 1)))
â // by applyè¦åï¼å å´ï¼
mean3(sum(y, z), b, sum(10, 1))
// è¨å·çè¨ç®ã¯ããã§ãªã·ãã¤
âcurry颿°ãã«ãªã¼åã«ãªã£ã¦ãããã¨
ãµã¼ããã£ã¨ç®çã®è¨ç®ãã§ãããï¼æºåããªãã¼ããããã¿ã¯ãï¼
ã¨å®ç¾©ããã¨ãcurry(f)ãå®éã«fã®ã«ãªã¼åã«ãªã£ã¦ãããã¨ãè¨ç®ã§ç¢ºããã¾ããããã¤ã¾ãã夿°xã¨å¤æ°ä¸¦ã³Yã«é¢ã㦠f x@Y = (curry(f)(x))Y ã示ãã¾ãã
curry(f) :=
λ(x).λY.apply(f, putfirst(x, array Y))
(curry(f)(x))Y
â // by å®ç¾©
((λ(x).λY.apply(f, putfirst(x, array Y)))(x)) Y
â // by ãã¼ã¿è¦å
(λY.apply(f, putfirst(x, array Y))) Y
â // by ãã¼ã¿è¦å
apply(f, putfirst(x, array Y))
â // by putfirstè¦å
apply(f, array x@Y)
â // by applyè¦å
f x@Y
// ãªã·ãã¤
ä»ã®è¨ç®ã¯ã(curry(f)(x))Y ãã f x@Y ã¸ã®æ¹åãªã®ã§ãã¤ã³ã¼ã«ã示ãããã¨ã«ãªãã¾ãããã©ãå®éã¯ãã®æ¹åã®è¨ç®ããçããªãããããã¨ãã¾ãã
念ã®ãããã©ã ãå¼ã®å®ç¾©ãJavaScriptã®å®ç¾©ã«å¤å®¹ï¼ã¢ã¼ãã£ã³ã°ï¼ãã¦ãããã¾ãæ¸ãã¦ããã¾ãï¼
curry(f) :=
λ(x).λY.apply(f, putfirst(x, array Y))
ï½ã¦ãã§ãã§ãã§
â
curry(f) :=
function (x) {
function Y {
apply(f, putfirst(x, [Y])
}
}
ï½ãã§ãªãã§ãª
â
function curry(f) {
function (x) {
function arglist {
apply(f, putfirst(x, [arglist]);
}
}
}
ï½ãã¥ãã¥ãã¥ã³
â
function curry(f) {
return function (x) {
return function (/* å¯å¤å¼æ° */) {
return f.apply(this, putfirst(x, arguments));
};
};
}
âè£è¶³ã¾ãã¯èè¶³
JavaScriptã®functionalãªæçããå¤å¤æ°ã©ã ãè¨ç®ã§ã¢ããªã³ã°ããã®ã¯é¢ç½ããããªæ°ããã¦ãããªãã§ããé¢åã ãããããã¨æãï¼ãããï¼ã
ããããã®ãªããã¡ã¿å¤æ°ï¼ã¡ã¿é¢æ°ï¼ã¡ã¿æ¼ç®åãæåããè¨ç®ä½ç³»ã«å«ãã¦èããã»ããããã§ããããããã¨ãã並ã³ã¯é ã§ã¯ãªããã¨ãããã©ã並ã³ãé ã ã¨å®ç¾©ãã¦ãLengthããCoarityã¨ã§ããã¦ã颿°é©ç¨(F A)ã®æ§æçæ¡ä»¶ã¯ Arity(F) = Coarity(A) ã®ã¨ãã ããã¨ããã¨ã«ãã³ããããã ãã颿°åãªã¼ãã¼ãã¼ãã許ããä¸ã§ãArity/Coarityãã¡ããã¨å®ç¾©ããã®ã¯ã¡ãã¨é¢åããã颿°é©ç¨ã®æ§ææ¡ä»¶ãã¤ã³ã¼ã«ã§æ¸ããªããªããã
[è¿½è¨ date="彿¥"]ã»ãã®ã¡ãã£ã¨èãã¦ã¿ããã©ãArity/Coarityãã¹ãã¬ã¼ãã«å®ç¾©ããã®ã¯ã§ãããã«ããã¾ããããç´°å·¥ãå¿ è¦ãã¤ãããæ ¹æ¬çã«æ¡å¼µããªãã¨ãã¡ã®ããã[/追è¨]
ã並ã³ãé ã ãã¨ããã¨ãå®éã®JavaScriptããé¢ãã¦ãã¾ããã©ãæ¬è³ªçã«å¤å¤ï¼å¼æ°ãå¤ãè¤æ°ããã®ãæ®éï¼ã¨ããè¨ç®ä½ç³»ã®ä¾ã«ãªã£ã¦ãå¤ãã£ãç¾è±¡ãèµ·ãããããããããããããã©ã