
C ++ãã³ãã¬ãŒãã¯ãã³ã³ãã€ã«æããã°ã©ã ãäœæã§ãããã¥ãŒãªã³ã°å®å
šèšèªã§ãã çŸåšãæ§æã¯ãã©ã¡ãŒã¿åãããåãèšè¿°ããããã«èšèšãããŠãããããè€éãªäœãã®æç¢ºãªè¡šçŸã«ã¯ããŸãé©åããŠããŸããã ãã®èšäºã§ã¯ãåãšãã¿ãŒã³ãã©ã®ããã«å€ãšé¢æ°ã«ãªãã®ãããããŠèè
ãC ++ãã³ãã¬ãŒãã«ç¿»èš³ãããç¬èªã®é¢æ°åèšèªãäœæããããšè©Šã¿ããã®ã調ã¹ãŸãã ããã¹ããèªãã«ã¯ã颿°åããã°ã©ãã³ã°ã®åéã®ç¥èã¯ã»ãšãã©å¿
èŠãããŸããã
ã©ã®ããã«æ©èœããŸããïŒ
ããã§ã¯ãããã°ã©ã ãã³ãã¬ãŒãããã³ã³ãã€ã«æ®µéãæ§ç¯ããããã®åºæ¬çãªããªãã¯ãé
眮ããŸãã 颿°åããã°ã©ãã³ã°ã«æ
£ããŠããªã人ã®ããã«ãå¿
èŠãªæŠå¿µãç°¡åãªèšèªã§èª¬æããŸãã åºæ¬çãªããšãæ€èšããããæ°ããèšèªããã®æ§æãæ©èœãããã³åé¡ã«é²ãæºåãã§ããŠããŸãã ããã«äž»èŠãªãã®ã«çŽæ¥è¡ããã人ã¯ãèšäºã¿ã€ãã«ã®åè¡šç€ºã®æšªã«ããç·è²ã®åçã«ã¹ã¯ããŒã«ã§ããŸãã
æ£çŽãªãšãããæ°å¹Žåãç§ã¯ããã§ãåŒã®æŒç®åã®åªå
é äœã倿Žããã¢ã«ãŽãªãºã ã®äŸã䜿çšããŠãã³ã³ãã€ã«æããã°ã©ã ã®åçã説æããæçš¿ãæžã蟌ãããšããŠããŸããïŒã€ãŸãã
å¥ã®åªå
é äœã§ãåæ§ç¯ããããã®æ¹æ³ãèšç®ãã
ãããã§ã¯ãªã
ïŒ
é·ãèšäºãåçãšUMLãã€ã¢ã°ã©ã ã§ã»ãŒçµããŸããããçªç¶ãã¡ã¿ããã°ã©ã ãããã§é »ç¹ã«èšãããããšã«æ°ä»ããŸããã ããã«ãå®éã®äœ¿çšã®ããã«
constexpr
ã远å ããŸããããç§ã¯åé¯ãããšã³ã¿ãŒãã€ã¡ã³ãã®åéã«çãŸããæå°éã®èšèªæ©èœã䜿çšãããã£ãã®ã§ãã æ³šç®ãã¹ãèšäº
HurrTheDurrããã®
ã³ã³ãã€ã«æã®ç掻ãšã³ã³ãã€ã«æã® è§£éããŸãã¯ilammyããã®C ++ 11ã®ã©ã ãã®ä»£æ¿çè§£ ïŒ2ã€ç®ã¯ããããŒãã³ã¢ã§ã
constexpr
using template
ã
using template
ãªãïŒã¯ãåé¯ããå¿ãç¥ãå¿
èŠãããã»ãŒãã¹ãŠã説æããŸããã ãã®çµæãèšäºããã©ããã³ããŒã®ãŸãŸæ®ããŸããããã¡ã¿ããã°ã©ãã³ã°ãžã®æ¬²æ±ã¯æ®ããŸããã§ããã ãããŠä»æ¥ãç§ã¯æ°ããæžãããããã¹ããšæ°ããã¢ã€ãã¢ã§æ»ã£ãŠããŠããŸãã
ç§ã®åªåã«ãããããããèªè
ãçŽ æãçè§£ããã®ããŸã é£ããå Žåã¯ããããã®èšäºãèªãããšããå§ãããŸã-ãã®åŸãPaul Hudack et alãããã®Haskellã®ç°¡åãªç޹ä»ïŒ
ããŒã1 ã
ããŒã2 ïŒDenis Moskvin and
Lambda calculus by
ibessonovã«ãã JavaScript ã ãã®ãã¹ãŠãããçšåºŠèè
ã«åœ±é¿ãäžããããããèªè
ã圱é¿ãåããã§ããããïŒïŒ
ã¡ã¿å€ãšã¡ã¿é¢æ°
ã¯ã©ã¹ãã³ãã¬ãŒãã¯ãããæå³ã§ã¯ãåãåãå
¥ããŠè¿ãåã®é¢æ°ã§ãã ãããã£ãŠããã¿ãŒã³ã¯ã¡ã¿é¢æ°ã«ãªããã¿ã€ããšæŽæ°ã¯ã¡ã¿å€ã«ãªããŸãã ããšãã°ãã¡ã¿é¢æ°
std::vector
ã¯ã¡ã¿å€
T
ãåããã¡ã¿å€
std::vector<T>
ãè¿ããŸãã ã¡ã¿å€ã«ã¯ãäžé£ã®ã¡ã¿ãã£ãŒã«ãïŒC ++ã®èгç¹ãã-ãã¹ããããã¯ã©ã¹ãåãšã€ãªã¢ã¹ãéç宿°ãã£ãŒã«ãïŒããããããã«ãã£ãŠæãè峿·±ãããšãã§ããããšãéèŠã§ãã
value
ãªã©ã®ã¡ã¿ãã£ãŒã«ãã1ã€éžæããã¡ã¿é¢æ°ãè¿ãå€ãšããŠçè§£ããããšãã§ããŸãã æŽæ°äžã®ã¡ã¿é¢æ°ã¯éåžžã«ç°¡åã«æžãããšãã§ããŸãïŒ
template <int x> struct square { static const int value = x * x; };
ã¡ã¿é¢æ°ã¯ãFPã§æ¬¡ã®ããã«
åŒã³åºãããŸãïŒ
square<5>::value
ã
ããããæŽæ°ã¯éåžžã®å€ã§ãããåçŽãªC ++ã§ååãªã®ã§ãæŽæ°ãã¡ã¿åŒã§äœ¿çšããã®ã¯ããã¹ããŒããã³ããããªãã§ãããã çã®æ£çŽãªã¡ã¿ã¯ã¿ã€ãã§ãã ãããäœæããæãç°¡åãªæ¹æ³ã¯ãæ§é äœã宣èšããããšã§ãïŒ
struct One; struct Zero;
C ++ã®èгç¹ããèŠããšã
one
ãš
zero
宣èšãã㊠zero
ã ãã§ãå®éã«
zero
ã§ããŸããã ããã§ååã§ããïŒ ã¯ã ããã§ã¯äœãçãããããããã©ã®ããã«äœ¿çšããã®ã§ããïŒ åœŒãã¯å¹³çã§ãããããã¯ç§ãã¡èªèº«ã«ãšã£ãŠã®ã¿éèŠã§ãã ãããã¯ãã·ã³ããªãã¯èšç®ã§äœ¿çšã§ããæœè±¡çãªã·ã³ãã«ã®äžçš®ã§ãïŒMathematicaããã®ä»ã®ãã®ãšã»ãšãã©åãã§ãïŒã ã¡ã¿ããã°ã©ã ã¯ãããŸããŸãªè€éãã®ã¡ã¿åŒãèšç®ããŸãã æåã«ãããã®è¡šçŸãæ€èšããå°ãåŸã«ã·ã³ãã«ã®è§£éãšçµæã®è¡šç€ºãæ±ããŸãã
ããŒã«å€ãšããŠ0ãš1ã®å ŽåãNOTãANDãããã³OR颿°ãèšè¿°ããã®ã¯èªç¶ã§ãã åŠå®ã®ã¡ã¿æ©èœãèæ
®ããŠãã ããã
template <typename T> struct Not { typedef Zero value; }; template <> struct Not <Zero> { typedef One value; };
å€ãåã
Not
ããã®å€ããŒãã®å Žåã¯1ãè¿ããŸãã ãã以å€ã®å Žåã¯ãã¹ãŠããŒããè¿ããŸãã ãããã£ãŠããã³ãã¬ãŒãã®ç¹æ®åã«ãããåææ®µéã§ã¯ãã¿ãŒã³ãããã³ã°ïŒãµã³ãã«ãšã®æ¯èŒïŒããããŸããç¹å®ã®å€ãæã€1ã€ä»¥äžã®åŒæ°ã«å¯Ÿãã颿°ã®åäœãåå¥ã«èšè¿°ããããšãã§ããŸããå¿
èŠãªå°éåã ããã䜿çšããŠããã§ã«ååž°çãªãã®ãæžãããšãã§ããŸãïŒããšãã°ãéä¹ã説æã
fac<0>
ãš
fac< >
ã«åå²ããïŒã
äžèЧ
ããã©ã«ã
value
å¶éãããŠããªã
value
ãå€å€é¢æ°ãã©ã®ããã«èŠãããæ³åã§ããŸãã 颿°åããã°ã©ãã³ã°ã®å°éå®¶ã«ãªãã¿ã®ãã
Cons
ãªã¹ãã³ã³ã¹ãã©ã¯ã¿ãŒãšç©ºã®
Nil
ãªã¹ããäœæããŸãããã
template <typename h, typename t> struct Cons { typedef h head; typedef t tail; }; struct Nil;
FPã®
Cons
ã¯ãæåã®èŠçŽ ã®ãªã¹ãïŒå
é ïŒãšä»ã®èŠçŽ ã®ãªã¹ãïŒæ«å°ŸïŒãäœæãã颿°ã§ãã éåžžãªã¹ã
\ {1ã2ã3 \} Cons<one, Cons<two, Cons<three, Nil>>>
äžèŽããŸãã ãªã¹ããæäœããã«ã¯ããã®ã³ã³ããŒãã³ããååŸã§ããå¿
èŠãããããã
Cons
ããããïŒ
Cons<...,...>::head
ïŒãšããŒã«ïŒ
Cons<...,...>::tail
ãè¿ãå€å€é¢æ°ã«ããŸã
Cons<...,...>::tail
ïŒã OOPæå¥œå®¶ã¯ã
Cons
ãã³ã³ã¹ãã©ã¯ã¿ãŒã§ããã
head
ãš
tail
ãgetterã§ããããšãæ³åã§ããŸãã FIã§ã¯ããã¹ãŠã®å²ãåœãŠã¯ã倿ŽãããåŒæ°ã䜿çšãã颿°
ã®ã¢ããªã±ãŒã·ã§ã³ã®
åŒã³åºãã«çœ®ãæãããããããã»ãã¿ãŒãšãã®é¡äŒŒç©ã¯ãããŸããã
颿°åèšèªã«ã¯ã«ãŒãããªãããããã®ãããªãªã¹ãã¯éåžžââãååž°çã«å®è¡ãããŸãã
Haskellã¯ãã€ã³ãã»ã©æããªãããšãããããŸããã ã©ããéåžžã«ã·ã³ãã«ã«èŠããã®ã§ããã®èšèªã§äŸãæç¢ºã«ããããã«äŸã远å ããããšã¯çœªã§ã¯ãããŸããã æºåãã§ããŠããªãèªè
ã®ããã«ãC ++ãåŠæ ¡ã®æ°åŠãšã®äž»ãªéãã«æ³šæããŠãã ãããHaskellã§ã¯ãåŒæ°ã¯ã¹ããŒã¹ã§åºåãããæ¬åŒ§ã§ã°ã«ãŒãåãããŸããã ããªãã¡
Haskellã§ã¯
f (x+y) (gy) z
ãšããŠèšè¿°ãããŸãã
匷ãåä»ããããHaskellãC ++ãšã¯ç°ãªããã¢ãã«ã®åä»ãã¯ãã³ãã¬ãŒãèšèªã§æ©èœããŸãã
negate<One>::value
ã¯ãã¡ããåäœããŸãããã
One
ã«
head
ãš
tail
ã¡ã¿ãã£ãŒã«ããããå Žåã¯åäœããŸãã ãã ããïŒ
negate<One>
::value
negate<One>
ãåç
§è§£é€ããã
negate<One>
ããªãéãããã°ã©ã ã¯ã³ã³ãã€ã«ãç¶è¡
ããŸãã
é«é颿°
颿°åèšèªã§ã¯ã颿°ã¯åãæå³ãæã¡ãŸãã ãããã£ãŠã髿¬¡é¢æ°ãæžãããšãã§ããŸã-颿°ãåŒæ°ãšããŠåãåããã颿°ãè¿ããŸãã ããšãã°ããªã¹ãã®èŠçŽ ããšã®å€æã¯FWPãããã䜿çšããŠå®è¡ãããŸãã
STLã«ã¯ã
std::transform
ãšåŒã°ãããã®ãããªå€æãå«ãŸããŠããŸãã ãã®èšèªã§ã¯ã
map
ã¡ã¿é¢æ°ã¯ããã³ãã¬ãŒãã«ãããã³ãã¬ãŒããã©ã¡ãŒã¿ãŒåã䜿çšããŠå®£èšãããŸãã
f
ã«ã€ããŠã¯
f
ããã§åã«èª¬æãã
Not
颿°ã«çœ®ãæããŠããã¬ã®ãªã¹ããèšç®ã§ããŸãã
typedef map<Not, Cons<One, Cons<One, Cons<Zero, Nil>>>>::value list;
åŒã®åœåæäœ
typedef
ã¯ä»£å
¥æŒç®åãšåçã§ããããšã
typedef
ã ãŸãã¯ã颿°åèšèªã®æ¹ãæ£ãããšæãããã®ã¯ãååãšåŒã®å¯Ÿå¿ãæå®ããæäœã§ãã
C ++ 11以éã§ã¯ãåãšãã³ãã¬ãŒãã®ãšã€ãªã¢ã¹ã䜿çšããŠãæ¢ç¥ã®åŒãéããŠå€ãšé¢æ°ãèšå®ã§ããŸãã
using x = Not<One>::value; template <typename xs> using g = Cons<x, xs>;
ã¡ã¿é¢æ°ãåäžã®ã¡ã¿å€ãè¿ãå Žåããã³ãã¬ãŒããšã€ãªã¢ã¹ã¯
value
ã¡ã¿ãã£ãŒã«ããåé€ããŸãã ããã¯ãããã°ã©ããŒã
::value
æç€ºçã«æå®ããã®ãé¢åã§ãèšç®å¯èœæ§ã®èŠä»¶ã課ãå Žåã«ãã䟿å©ã§ãã
ããã°ã©ã ã¯åçŽã«ç¡éååž°ã«å
¥ãããšãã§ããŸãnegate<Zero>
ã³ã³ãã€ã«ãããŸããã
negate<Zero>::value
ã¯ã³ã³ãã€ã«ãããªãããšãæãåºããŠãã ããã é¢åãªã¡ã¿ãã£ãŒã«ãã䜿çšããŠãæ¡ä»¶ã«å¿ããŠãã©ã³ãã®1ã€ã ãã®
::value
ãèšç®ãããã®å€ãè¿ããã©ã³ãã¡ã¿é¢æ°ãäœæã§ããŸãã åŒã®1ã€ãè©äŸ¡ãããããšã¯ãããŸããããã¹ãŠã®æäœã¯
::value
åãåã£ããšãã«ã®ã¿å®è¡ããã誰ãããã«è§ŠããŸããã§ããã
åæã«ããã³ãã¬ãŒããšã€ãªã¢ã¹ãæã€ããªã¢ã³ãã¯ãäžéšã®
g<x>
ãæ¢ã«èšç®ããã
f<x>::value
ã®æå³ãæã€ããšãæäŸã
f<x>::value
ã ãŸãã2ã€ã®ååž°ãªãã·ã§ã³éã§åå²ããå Žåãèšç®ã¯ç¡éã«ãªããŸããããã¯ãã³ã³ãã€ã«æ®µéã§ã®ã¹ã¿ãã¯ãªãŒããŒãããŒã«çžåœããŸãã
template <typename expr1, typename expr2> struct If <True, expr1, expr2> {
åºæ¬çã«ããã³ãã¬ãŒããšã€ãªã¢ã¹ã¯ãã³ãã¬ãŒãã«çžåœããåãªãæ§æç³ã§ãããçãããšãã§ããŸãã
ç絡
éåžžã®C / C ++ã§ã¯ã颿°ãå®äºããåŸã«åŒæ°ãšããŒã«ã«å€æ°ãæ»ã¬å Žåã颿°åèšèªã§ã¯ã颿°ã¯èŠªé¢æ°ã®åŒæ°ãšããŒã«ã«å€æ°ã«äŸåãã颿°ãè¿ãããšãã§ããŸãã ãããã£ãŠãèŠªé¢æ°ã¯ãã§ã«å®äºããŠããŸããããã®ããŒã«ã«å€æ°ã¯å颿°ã«ãã¢ã¿ãããããããŸãŸæ®ããŸãã å®éã«ã¯ãããã¯ãããšãã°åé
颿°ãªã©ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå¿
èŠãªå Žåã«äŸ¿å©ã§ããããã®å®è£
ã«ã¯äŸåããã³ã³ããã¹ãããããŸãã
ããšãã°ã
fx
ã¯ã颿°
f
åŒæ°
x
æé»çã«äœ¿çšããŠãåé
颿°
g
è¿ããŸãã
fx = g where g xs = Cons x xs
Cons
ãæ®ãããšãã§ããŸããã
g
ã¯æ¢ã«èšè¿°ãããŠãã
map
颿°ã«åé
ãšããŠæž¡ãããšãã§ããŸããã
Cons
ã¯ãã€ããªã§
Cons
ãŸããïŒ
ãã ããéåžžã®C ++ã¯ã¯ããŒãžã£ã®æ¬ åŠã«æ©ãŸãããŸãããããè¡ãã«ã¯ãæ©èœãªããžã§ã¯ããŸãã¯ã©ã ã颿°ã䜿çšããŸãã ã€ãŸããã°ããŒãã«å€æ°ãä»ããŠé¢æ°ã«è¿œå ã®ãã©ã¡ãŒã¿ãŒãæž¡ããšã颿°ã䜿çšãã代ããã«ããã°ã©ã ã®æè»æ§ã«éåããå Žåããªããžã§ã¯ãã䜿çšãããŸãã
this
ã«ã¯å¿
èŠãªã³ã³ããã¹ãããã¹ãŠå«ãŸãã
operator ()
ã¯ã€ã³ã¿ãŒãã§ã€ã¹ã«å¿
èŠãªåŒæ°ãåããŸã FPã®çŸããã³ã³ã»ããã¯ãåçã®OOPã³ã³ã»ããã«çœ®ãæããããŠããŸãã æšæº
std::function
ãã³ãã¬ãŒããæäŸãããŠããŸãïŒ
颿°ïŒããšãã°ã
int(int)
ïŒãæ©èœãªããžã§ã¯ãïŒããšãã°ã
std::function<int(int)>
ïŒã«çœ®ãæãããšãC ++ããã°ã©ããŒã¯ãã¯ããŒãžã£ãŒã®æ¬æ Œçãªã¢ããã°ãååŸããŸãã
ãã³ãã¬ãŒãã¬ãã«ã§ã¯ãã颿°âãªããžã§ã¯ããã眮ãæããå¿
èŠã¯ãããŸããã ã¯ããŒãžã£ã¯èšèªèªäœã«ãã£ãŠãµããŒããããŠããŸãïŒ
template <typename x> struct f { template <typename xs> struct g { typedef Cons<x, xs> value; }; };
C ++ãHaskellãšã¯ç°ãªããããã§ã¯
f
æåã¯
g
ãåãåºãããŸãããæ®ãã¯æ£çŽãªã¯ããŒãžã£ãŒã§ãã åŒ
f<x>::g
ã¯ãéåžžã®åé
颿°ïŒããšãã°ã
Not
ïŒã®ä»£ããã«äœ¿çšã§ããŸãã
ãªã¹ãã®ç¡å¶éã®åŒæ°ãŸãã¯æ§æç³
å¯å€é·ãã³ãã¬ãŒãã䜿çšãããšããªã¹ããã颿°ãèšé²ã§ããŸãã ç¹°ãè¿ããŸãããå Žåã«ãã£ãŠã¯ãã䟿å©ã§ããããããããªããã°
Cons
ãš
Nil
ãšå¹³åã«æ®ããããšãã§ããŸãã ããã«ãããã¯ããã«åçŽãªåãã«ãªãããšããããŸãã 2ã€ã®ãªã¹ããã¡ã¿é¢æ°ã«æž¡ãã«ã¯ã2ã€ã®ãªã¹ããæž¡ãã ãã§ååã§ãïŒ
f<xs, ys>
ãå¯å€åã®ãã³ãã¬ãŒãã®å ŽåãæåŸã®ãªã¹ããé€ããã¹ãŠã®ãªã¹ãããã£ããã£ããã©ãããŒãæå®ããå¿
èŠããããŸãïŒ
f<list_wrapper<x1,x2,x3>, y1, y2, y3>
ãããã¯ãä»»æã®é·ãã®åŒæ°ã®ãªã¹ãã¯1ã€ã§ããå¿
èŠããããè¡ã«èšè¿°ãããããã€ãã®ãªã¹ãã¯åã«ãçµåãããããã§ãã èšç®ã®æåŸã«ãã©ãããŒãè¿ãå¿
èŠããããŸãã C ++ã§ã¯ãããã€ãã®ã¿ã€ãã®ãªã¹ããå
¥åããããšã¯ã§ããŸããã ãããŠãã©ãããŒãããªã¹ãããåãåºãããŠã¡ã¿é¢æ°ïŒããšãã°
f
ïŒã«è»¢éããã«ã¯ãã¡ã¿ã³ãŒã«ããã¯ã䜿çšããå¿
èŠããããŸãããã®ã¡ã¿é¢æ°
f
ãåãå
¥ãããªã¹ãã®å
å®¹ãæž¡ãã¡ã¿ã¡ãœãããã©ãããŒã§å®è£
ããŸãã
typename <typename... xs> struct list_wrapper {
å埩/ååž°ãªã¹ãåŠçã¯ãããã䜿çšããŠãå®è£
ããããšã¯ã§ããŸããã ããšãã°ã
negate
ãå®è£
negate
ã¯ãè£å©åé
ã¡ã¿é¢æ°
f
ãäœæããå¿
èŠããããŸããããã¯ããªã¹ãã®æ«å°Ÿã«ååž°çã«
negate
ãé©çšããçµæãåãåãããããã®åŠå®ãèšç®ãããªã¹ãã®ã©ãããŒãè¿ããŸãã
typename <typename x, typename... xs> struct negate { template <typename... ys> struct f { typedef list_wrapper<Not<x>::value, ys> value; }; typedef typename negate<xs>::template call<f>::value; }; typename <> struct negate<> { typedef list_wrapper<> value; };
ãã©ãŒã ã®çŸããèšé²ã®ããã«ããã倿ããŸãã
\ {x1ãx2ãx3 \} çºè¡šæã«ããããã®ã·ãŒã±ã³ã¹ãããã¯ã転éãããã³ã¢ã³ããã¯ããå¿
èŠããããŸããã
negate
ã¯ã
Cons
/
Nil
ããŒãžã§ã³ãšæ¯èŒããŠããããã°ããŸãã ããã§ã¯ãFPã®åºæ¬ãšHaskellâC ++ã®æ©æ¢°ç亀æã§ãéåžžã®ãããŒãžã§ã³ãäœæããã®ã«ååãªå Žåãããæ·±å»ãªè£œé ãå¿
èŠã«ãªããŸãã ãã®ãããå¯å€ãã³ãã¬ãŒãã䜿çšããŠããã©ã¡ãŒã¿ãŒã®ã·ãŒã±ã³ã¹ã
Cons
/
Nil
ãªã¹ãã«å€æããã©ãããŒãäœæããããã°ã©ã ãå®è£
ãããšãã«ããã䜿çšããããšããå§ãããŸãã ãã®ãããå¿«é©ãªã³ã³ãåºåããªã¹ãã䜿çšããŠãªã¹ããèšå®ããããåçŽãªã«ããŽãªãŒã§èããããšãã§ããŸãã
å€ã®äžçãžã®åºå£
ãããŸã§ãå€ãšçŽç²ãªé¢æ°ã®ã¿ãèæ
®ããŠããŸããïŒé©çšã®çµæã¯åŒæ°ã®ã¿ã«å®å
šã«äŸåããåãåŒæ°ã«å¯ŸããŠã¯é¢æ°ã¯åãå€ãäžããŸãïŒã ããã°ã©ã ã®çµæãåºåããã«ã¯ãã³ã³ãã€ã«æ®µéã§çŽç²ãªé¢æ°ãšèšç®ã®äž¡æ¹ã䜿çšããå¿
èŠããããŸãã
ã¡ã¿ããã°ã©ã ã§ã®èšç®ãå®äºãããšãçµæã®åŒã¯å®äžçã®ãšã³ãã£ãã£ãšããŠè§£éããã倿°ã«ä¿åãããããç»é¢ã«è¡šç€ºãããŸãã åºåã«ãã³ãã¬ãŒãã¯ã©ã¹ã䜿çšã§ããŸãã ã³ã³ã¹ãã©ã¯ã¿ãŒãŸãã¯ä»ã®ã¡ãœããã«ã¯ãåœä»€ã³ãŒããå«ãŸããŠããŸãã ãã¿ãŒã³ãããã³ã°æ©èœããã¹ãŠã®ãªãã·ã§ã³ãæ€èšããã®ã«ååãªå Žåãã¡ã¿å€èªäœïŒããšãã°ã
void One::print();
ïŒå
ããŸãã¯ã¡ã¿é¢æ°å
ã®ããããã«ãªããŸãã ããã§ãããšãã°ã
print<...>
ã€ã³ã¹ã¿ã³ã¹ãæ§ç¯ããæ®µéã§ãåŒæ°ïŒåäœããŒãããŸãã¯ãªã¹ãïŒãåºåãã
print
ã¡ã¿é¢æ°ïŒ
template <typename T> struct print { print () { std::cout << "unknown number" << std::endl; } }; template <> struct print <One> { print () { std::cout << "1" << std::endl; } }; template <> struct print <Zero> { print () { std::cout << "0" << std::endl; } };
åæ§ã«ããªã¹ããå¿
èŠãªãã®ã衚瀺ã§ããŸãã ããšãã°ãANDãNOTãXORããã€ããªå ç®åšãå®è£
ããæ°åã
One
ãš
Zero
ãªã¹ããšããŠè¡šçŸããå ç®ãä¹ç®ãªã©ãæ§ç¯ã§ããŸãã
C ++ 11ããã³
decltype
ã®ç»å Žä»¥åã¯ãåã«å¯ŸããŠçŽç²ã«æ©èœçãªèšç®ãå®è¡ãã察å¿ããåã®å€æ°ããã³C ++ãªããžã§ã¯ããäœæãããããã«å¯ŸããŠèšç®ãå®è¡ããŠãããåã³åã«å¯Ÿããèšç®ã«æ»ãããšã¯äžå¯èœã§ããã
sum<sum<One, two>, three>
ãã¡ããããã®æ©èœã«ãããããäœã³ã¹ãã§C ++ã§ã€ããªãã®ãŒçã«æ£ç¢ºãªã³ãŒããèšè¿°ã§ããŸãããããã³ãã¬ãŒãã®ã¡ã¿èšèªã®ã€ããªãã®ãŒã¯ãããã«æºããŸããã ããšãã°ãHaskellã§ã¯ãåœä»€åäžçã®ææ¯ã«ããã飲ãã 颿°ã¯ãããã«ãã£ãŠæ°žé ã«æ¯ããããŸãŸã§ãããçŽç²ãªäžçã«å±ããéåžžã®å€ãè¿ãæš©å©ããããŸããã ã€ãŸããæ©èœçãªçŽåºŠããåœä»€åãžã®ç§»è¡ã¯ãäžæ¹åã«ã®ã¿è¡ãããšãã§ããŸãã
decltype
ãã
decltype
åã¯çŽåºŠã®é¡æšã§ãããå€ã¯åœä»€åã®äžçã®æ¬è³ªã§ãããåã®ã¿ããã³ãã¬ãŒããã©ã¡ãŒã¿ã«ãªããåã¯å倿ã«ãã£ãŠã®ã¿ååŸã§ããŸããã å€ãäœæãããšãåã«æ»ãããšã¯äžå¯èœã§ããã
C ++ 11ã§ã¯ãåãèšç®ãããã®åã®å€ãäœæããäœããã®æ¹æ³ã§å€æãã
decltype
ã䜿çšããŠçµæåãåã®åŒã«æž¡ãããšã
decltype
ãŸãã ãã ãã
decltype
ã¯åŒæ°ã
decltype
ãããæ©èœã®çŽåºŠã«éåããªããã«ãŠã³ããéå§ããå Žåã®è¡šçŸã®ã¿ã€ãããšãã質åã«ã®ã¿çããŸãã ãããã£ãŠã倿°ã®åŒ
ãdecltype
ãã©ã±ãããé¢ãããŸã§ãæž
æœããç¶æãããŸãã ãã³ãã¬ãŒãèšèªã®èгç¹ããã
decltype
æŒç®åã®ãªãŒããŒããŒããšãšãã«äœ¿çšãã
decltype
æçã§ãã æ¬¡ã®äŸã§ã¯ãåŒã¯åçã§ãããäžéšã¯ããã°ã£ãŠããŸããã
typedef sum<sum<one, two>, three> x; typedef decltype(one() + two() + three()) x;
ãã£ãããåºããšãæž
æœãã«éåããŸãã
auto v = one() + two() + three();
C ++ãã³ãã¬ãŒãã«å€æããé£è§£ãªèšèª
ã³ã³ãã€ã«æFJãšããŠã®C ++ãã³ãã¬ãŒãã®äž»ãªåé¡ã¯ãé床ã®åé·æ§ã§ãã ããããã¹ãŠã®
::value
ãè§æ¬åŒ§ãããã³
typename
ã¯ãããã°ã©ãã匷ã䜿ãæãããããã°ã©ã ã³ãŒããæ¡åŒµããŸãã ãã¡ããããã®ã¹ã¿ã€ã«ã§ããã°ã©ãã³ã°ããããšã決ãã人ã¯èŠããã¹ãã ãšããžãã¯ã¯èšã£ãŠããŸããã...ããã¯ITæ
åœè
ã®è³ããã°ãã°åŸããŠããç°åžžãªãšã³ã¿ãŒãã€ã¡ã³ãã®1ã€ã§ãã åé¯ãä¿åãããããšã確èªããããšæããŸãããèŠãã¿ããŸã èããããçšåºŠã«ã

äžè¬ã«ãç§ã¯ç¬èªã®èšèªãäœæããC ++ãã³ãã¬ãŒãã«ç¿»èš³ããããšã«ããŸããã ãããè¡ãã«ã¯å€ãã®æ¹æ³ããããŸãã JSFuckãã©ã³ã¹ã¬ãŒã¿ãŒã«ãã£ãŠè¡ããããããªæãç¬åµçãªå€æã䜿çšããããšãã§ããŸãã ãããããã®ãããªã¢ãããŒãã¯ãïŒaïŒå¥ã®äžå¿
èŠãªèšèªãçæããïŒbïŒC ++ããé¢å©ããïŒcïŒãŸã çºæããå¿
èŠããããïŒdïŒå®è£
ã«ãšãã«ã®ãŒãè²»ãããŸãã ãããŠãååã«åŒ·åã§äžå¿
èŠãªFYãéçºããŠå®è£
ããããšã¯ãé¢åã§åœ¹ã«ç«ããªãããžãã¹ã§ãã ç¹ã«ãC ++ãã³ãã¬ãŒããæ¢ã«é¢æ°ãã¯ããŒãžã£ããã¿ãŒã³ãããã³ã°ã«çžåœããæ§é ãæã£ãŠããå Žå...ãããŠããã¯ã¹ããŒãã§ã¯ãããŸããã
ç§ã¯æå€§ã®å¯Ÿå¿ã®éãéžæããŸããã ç§ã®èšèªã®ã³ãŒãã¯ã·ã³ãã«ã«èŠããã¯ãã§ãããã€ããªãã®ãŒçã«ã¯C ++ã«äŒŒãŠããŸãã ã€ãŸãã倿ã«ãããç§ã®èšèªã¯C ++ã§æãéèªçã«ç¿»èš³ãããã¯ãã§ãã ããã¯ããã¿ãŒã³ãè¶
ãã1ããã°ã©ã ã®æ§æäžã®ç ç³ã§ãããšæ³å®ãããŠããŸããã
äžèšã®ã³ãŒããäœæããèšèªã«æžãçŽãããã®æ©èœãšå®éã®ã¢ããªã±ãŒã·ã§ã³ã調ã¹ãŠã¿ãŸããããããŒãããšã1ãã®å€ã®æ±ºå®ãæ°ãåŠå®ãã颿°ããªã¹ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒããªã¹ããåŠå®ãã颿°ã®å®çŸ©ãFVPããããªã©ã®æ±ºå®ããåãé åºã§ç§»åããŸããå€ãšé¢æ°
structããŒã¯ãŒãã¯ãå€ã宣èšããããã«å¿
é ã§ã¯ãããŸããã One; Zero;
颿°å®£èšã¯ãåŒæ°ãšãã®åãäžæ¬åŒ§ã§å²ã¿ãã=ãèšå·ã®åŸãã«æ¬æãæ®ããŸããç¹å®ã®ã±ãŒã¹ã®èª¬æã¯ãäžè¬çãªã±ãŒã¹ã®èª¬æã®åŸã«ãããŸãããåŒæ°ã®å
·äœçãªå€ã¯ã¿ã€ãã瀺ããŠããªãç¹ãç°ãªããŸãã Not (val x) = Zero; // Not (Zero) = One; // And(val x, val y); // x,y != One,Zero And And(val x, One) = x; // One - , val x - And(val x, Zero) = Zero; // : Not(One) And(One, Zero)
C ++ã§ã¯ããã³ãã¬ãŒããã©ã¡ãŒã¿ã¯ã¿ã€ãïŒtypename
ïŒãå¥ã®ãã³ãã¬ãŒãïŒtemplate <typename> class
ïŒãªã©ã«ããããšãã§ãããããæå®ããå¿
èŠããããŸãããããã£ãŠãmeta-FVPãäœætypename
ããããšã¯ã§ããŸããããŸããã¿ã€ãã瀺ãèŠä»¶ã¯ç§ã®èšèªã«ãé©çšãããŸããããã©ã«ãã§ã¯val
ãéåžžã®ã¡ã¿å€ã«å¯Ÿå¿ããã¿ã€ããèšå®ãããŸãïŒC ++ã®æ§é ãŸãã¯éåžžã®ã¿ã€ãïŒã颿°ãèšè¿°ããããã«ãã¿ã€ããç¢å°ïŒ->
ïŒãšçµã¿åãããããšãã§ããŸããããšãã°ãval -> val
-åé
颿°ïŒ1ã€ã®ãã©ã¡ãŒã¿ãŒãåããã³ãã¬ãŒãïŒ(val, val) -> val
-ãã€ããªãŒé¢æ°ïŒ2ã€ã®ãã©ã¡ãŒã¿ãŒãåããã³ãã¬ãŒãïŒãªã©ãããã§ã翻蚳ã®ãªãã©ã«æ§ããå°ãéžè±ããã¿ã€ããšã€ãªã¢ã¹ãå°å
¥ããŸãããããã¯ãC ++ã®ïŒã¿ã€ããšã€ãªã¢ã¹ïŒãšã¯ç°ãªããŸããã䜿çšããŠ#type
å矩èªãèšå®ããŠãã¬ã³ãŒããããå°ãçãããé©åãªååãä»ããŠæå³ãæç¢ºã«ããããšãã§ããŸãã #type number = val; #type list = val; #type unary = number -> number; #type map_t = (unary, list) -> list;
Cã®#type
é¡äŒŒç©ãšèŠãªãããšãã§ã#define
ãç°¡åãªæ¹æ³ã§æåã§å®è¡ã§ããããã¹ã倿ãå®çŸ©ããŸããäžèЧ
䟿å©ãªæ©èœãšããŠè€æ°ã®è¿åããã£ã³ã»ã«ããŠããŸãããããã¯ããªã¹ããå®è£
ãããšãã«äŸ¿å©ã§ãã Nil; Cons(val x, val y) { head = x; tail = y; }
C ++ã§ç¿»èš³ããã颿°ãåŒæ°ã«é©çšãããšãèªåçã«å±éãã::value
ãŸããããã¯f(x)
åçf<x>::value
ã§ãããããCons
ã2ã€ã®ã¡ã¿ããŒã«ã®ã¿head
ãçæããtail
ãŸããé瀺ãé²ãããã«::value
ã¢ãã¹ãããã£ã䜿çšããŠæç€ºçã«å¿
èŠãšãããŠããŸãCons(x, xs)'
ãç§ã¯ãã®åé¡ã«ã€ããŠé·ãéèããŠããŸãããäžæ¹ã§::value
ã¯ãé »ç¹ã«äœ¿çšãããæ§é ã®1ã€ãèªåçã«éãããã¹ãã§ããããïŒaïŒé瀺ãããŠããªãå€ãéä¿¡ãïŒã¹ãã€ã©ãŒã®äžã§äžèšã®åå²é¢æ°ãšç¡éååž°ã®åé¡ãåç
§ïŒãïŒbïŒä»¥å€ã®ã¡ã¿ãã£ãŒã«ãã䜿çšããå¿
èŠããããŸããvalue
ããã®çµæãç§ã¯ããªãªããä»ããŠã¡ã¿ããŒã«ãæžãããšã¹ã±ãŒããã«èœã¡çããéæŒç®åãïŒããå°å
¥ããŸãã::value
ã Cons(x, xs)'.head; // x Cons(x, xs)'.tail; // xs Not(Zero); // One Not(Zero)'!; // One
ãã ããã¡ã¿ããŒã«::value
ã¯è€æ°ã®ãªã¿ãŒã³ãšå
±åããå¯èœæ§ããããŸããnegate
C ++ã§ãªã¹ãã®åŠå®ãå®çŸããè¿ãããå¯èœæ§ã®ããããŒã«ã«ã¡ã¿å€æ°ãäœæããŸããããã-åæ§ã«ããã¹ãŠã®å€ã®ã¿ããããªãã¯ã§ãïŒ // : // - , // negate (list list) = Cons(not_head, not_tail)' { h = list.head; // not_head = Not(h); // t = list.tail; // not_tail = negate(t); // } // ! // - negate (Nil) = Nil;
é«é颿°
åé
颿°ãšãªã¹ãã®ã¿ã€ãã宣èšããããããäœæããããšãæãåºããŠãã ããã // map (unary f, list list) = Cons(new_head, new_tail)' { h = list.head; // new_head = f(h); // t = list.tail; // new_tail = map(f, t); // } // map (unary f, Nil) = Nil;
ãã¡ãããunary
andã®ä»£ããã«ããããããlist
ããã«ç€ºãããšãã§ããŸãããã¬ã³ãŒãã¯é·ããªããèŠèŠçã§ã¯ãªããªããŸããval -> val
val
ç絡
ã¯ããŒãžã£ãŒã¯C ++ãã³ãã¬ãŒãèªäœã«ãã£ãŠãµããŒããããŠãããããããã§ç°åžžãªããšã¯ãããŸããã f(val x) = { g(val xs) = Cons(x, xs)'; }
ãã ããè¿ããã颿°ã®ååïŒgãªã©ïŒãæå®ããå¿
èŠããããŸããè¿ãããååã®ãªã颿°ã«ã¯ãååvalue
ãšreturnãå¿
èŠvalue
ã§ããC ++ã®ã¯ã©ã¹ãšåãååã®ã¡ã³ããŒãæ¢ã«ã³ã³ã¹ãã©ã¯ã¿ãŒã«äžããããŠãããããæ°ããæå³ãäžããããšã§typedef
ã³ã³ãã€ã«ãšã©ãŒãçºçããŸãã template <typename x> struct f { template <typename xs> struct value {
C ++ã§ã¯ããã¹ãããããã³ãã¬ãŒãã«ç¹åã§ããªããããåã¡ã¿é¢æ°ã®ãã¿ãŒã³ãããã³ã°ã®ä»£ããã«ãä»ã®ã¡ã«ããºã ã䜿çšããå¿
èŠããããŸããC ++ã§ã¯ããã³ãã¬ãŒãå
ã§ãã³ãã¬ãŒããã©ã¡ãŒã¿åãåå©çšããããšãã§ããŸãããç§ã®èšèªã®ãããã®ååã¯ããŒã«ã«ã¡ã¿å€æ°ãåç
§ãããã³ãã¬ãŒããè¶
ããªããããååã®å€æŽãèªååããŸããã f (val x) = g(Not(x)) { g (val x) = x;
ç§ã«ãšã£ãŠã¯ããã®ãããªå€æã¯ãã¹ããŒããã³ããããã远å ããŸããã§ããïŒæäœæ¥ã«ããäºçްãªäº€æã®å¯èœæ§ãããããïŒãããæ®µéã§ãçŽç²ã«æ©èœããéšåãå€ããå°ãªããC ++ã«æ£åžžã«å€æãããå°ãªããšãçµæãåºåã§ããå¿
èŠãããããšã倿ããŸããããã®éšåã¯ãç§ã«ãšã£ãŠè峿·±ããã³ãã¬ãŒãã®ã¯ãªãŒã³ãªäžçã®ç¯å²ãè¶
ããŠããïŒãã®ãããçµæãšããŠããã«æªããšèããããŠããŸããïŒãããã«éèŠãªããšãšããŠãéåžžã®C ++ã§ååã«èª¬æãããŸããããã³ãã¬ãŒãã§ã³ã³ãã€ã«æã³ã³ãã¥ãŒãã£ã³ã°ã䜿çšããããã°ã©ã ã§ã¯ããã³ãã¬ãŒãã®ãªãéåžžã®C ++ãå€éšãžã®ã¢ã¯ã»ã¹ãæ
åœããŸããã€ãŸããèªåã®èšèªãC ++ã®ã¹ãŒããŒã»ããã«ããããC ++ã®ç¬èªã®ã¢ããã°ãäœæããå¿
èŠããããŸããããã¡ãããæåã®ãªãã·ã§ã³ãéžæããŸãããæ®ã£ãã®ã¯ãC ++ã³ãŒããæ¿å
¥ããæºè¶³ããŠæããããããã®ã¿ã°ãå
¥åããããšã§ãããããããè«ççãªåé¡ãçºçããŸããïŒãœãŒã¹ã³ãŒãã§ã¯::value
ãã¡ã¿é¢æ°ãé©çšããããã«äœ¿çšãããããšã¯ã©ãã«ãèšèŒãããŠããŸãããf(x)
-ããf<x>::value
ã§ã¯ãªãcall<f, x>::result
ããã®ç¥èã¯ç¿»èš³è
ã®å
éšã«ä¿åãããŠãããããã°ã©ã ã§ã®äœ¿çšã¯æœè±¡åãæã¡ç ŽããŸãã f(val x) = One; f(Zero) = Zero; main { print<f<One>::value>(); // ? }
èå³ã®ãªãåœä»€åéšåã«é¢ããã¢ã€ãã¢ã¯ã»ãšãã©ãããŸããã§ãããããã€ãã®ãªãã·ã§ã³ãèãåºããåŸãïŒaïŒéåžžã®C ++ã䜿çšããå¯èœæ§ã®ããåœä»€åãããã¯ãå°å
¥ããïŒbïŒçŽç²ãªé¢æ°äžçããå€ããšã¯ã¹ããŒãããããšã«ããŸãããimpure { }
å€/颿°ã宣èšãã代ããã«ãããã¯ã衚瀺ããã颿°ã宣èšãããšãã«ã=ãèšå·ã®çŽåŸã«è¡šç€ºãããå ŽåããããŸãããããã®å ŽåãC ++ã³ãŒãã¯ããã°ã©ã ã®é©åãªå Žæã«æ¿å
¥ãããŸããåŒããšã¯ã¹ããŒãããã«ã¯ãããŒã¯ãŒãããã®åã«é
眮ãimpure
ãŸããC ++ã®èгç¹ããèŠããšãããã¯åŒã§èšè¿°ãããã¿ã€ãã®ãªããžã§ã¯ããäœæããããšãšåçã§ããäœæ¥ã®ãã¢ã³ã¹ãã¬ãŒã·ã§ã³ãšããŠimpure
ããªã¹ãã®ãããªã³ã¿ãŒããæºåããŸãã print(val list) { head = list.head; tail = list.tail; impure { // typedef- head, tail : print() { impure print(head); // "print<head>();" std::cout << ", "; impure print(tail); } } } print(Zero) = impure { // print(Zero) { impure { ..., print() { std::cout << "0"; } } print(One) = impure { print() { std::cout << "1"; } } print(Nil) = impure { print() { std::cout << std::endl; } }
åå空é
çè«çã«ã¯ç§ã®èšèªã¯ããã®äžã«ãåŸæ¥ã®Cã§äœ¿çšãããã©ã€ãã©ãª++ãIãprokinulããäœæããããšãã§ããŸãã®ã§namespace
ããšusing namespace
ïŒ namespace ns1 { namespace ns2 { f(val x) = x; } } namespace ns3 { using namespace ns1.ns2; g(val x) = f(x); }
using namespace
ãŸããå¿
èŠãªæªçœ®ãC ++ã§ã¯ãå Žåã«ãã£ãŠã¯ããã¥ãŒã¬ã³ãŒãã§ã¯ååã§ã¯ãããŸããf<x>::y<z>
ãããªãã®å Žåf
ãx
ãŸãã¯z
-ã§ã¯ãªãç¹å®ã®ã¿ã€ã/ãã³ãã¬ãŒããããã³ãã³ãã¬ãŒããã©ã¡ãŒã¿ã«ã¯ã::y
ãã©ãã¯ããã¯ã¹ã®åºåãšãªããŸããèšç®æã«åŸããããã®ã瀺ãå¿
èŠããããŸã::y
-ã¿ã€ããŸãã¯ãã¿ãŒã³ïŒtypename f<x>::y
ãŸãã¯ãªã©f<x>::template y<z>
ïŒãç§ã¯ãããã®åœä»€ãèªååãããããåçŽãªæåèšè¿°ã®ããã«æ§æç³ãå®è£
ããªãã£ãããããããã䜿çšãããã³ã«ãtypenameãã®ããã«èŠããŸããããªãã¡
f<x>::y<z>
ã¯ééã£ãçš®é¡ã®ãã®ã«ç¿»èš³ãããŸãtypename typename f<x>::value::typename y<z>::value
ãåå空éã®å Žåãããã¯äžèŠã§using namespace
ãããtypenameæ¿å
¥ã®å¿
èŠæ§ãåé¿ããŸããã©ã ãã¹
ã©ã ã颿°ãªãã§é¢æ°åèšèªãæ®ããããããŸããã§ãããå®å
šãªãµããŒããå®è£
ããããšã¯ã§ããŸããã§ãããã代ããã«ãå°ãªããšã颿°ã宣èšãããšãã«åŒæ°ãã=ãèšå·ã®å察åŽã«è»¢éããããšã¯å¯èœã§ã f (val x) = y(x) { y(x) = g(x); }
ã©ã ãã®å®å
šãªãµããŒãã¯ãC ++ã§ã¯ïŒaïŒå¿åã¯ã©ã¹ãäœæã§ãããïŒbïŒã¿ã€ããšåçã«ãªããŸã§èª¬æãå±éããã«ãã³ãã¬ãŒãã«çžåœãããã®ã宣èšã§ããªããšããäºå®ã«ãã£ãŠåŠšããããŸããã€ãŸããæ°åŠçã«ã¯ã ããªãã¯æžãããšãã§ããŸããã代ãã㫠䜿çšããå¿
èŠããããŸã ã
åœä»€åããã°ã©ãã³ã°ã®ãŠãŒã¶ãŒã¯ãã§ã«ãã®ç¶æ³ã«æ
£ããŠããŸããã颿°åããã°ã©ãã³ã°ã®æšæºã§ã¯ããã¯ããªãé¢åã§ãã template <typename x> struct f {};
ãã¥ãŒãšã³ããªãå®è£
map(lambda(val x) -> y, xs)
ããã«ã¯ãèšèªã倿Žããäžæçãªååã§ãã³ãã¬ãŒããçæããå¿
èŠããããŸããåè¿°ã®ããã«ãvalue::value
ããã¯ã³ã³ã¹ãã©ã¯ã¿ã§ãããããã©ã ããè¿ãã©ã ããçŽæ¥å®è£
ããããšã¯ã§ããŸãããã©ã ããã颿°ãè¿ãããã¥ãŒã¬ã³ãŒããèš±å¯g = f
ããã«ã¯ãä»ã®æŠå¿µã䜿çšãããã©ã³ã¹ã¬ãŒã¿ãŒãã»ãŒå®å
šã«æžãçŽãå¿
èŠããããŸããæ¬ ç¹ãšå¯èœãªè§£æ±ºç
- ããŒã«ã«å€æ°ã®é衚瀺ã¯ãããŸããã ã³ãŒãã«
æ¿å
¥impure { private: }
ããããèšèªã®åºæ¬çãªå€æŽãè¡ãããšã«ãããåçŽã«è§£æ±ºãããŸãã - «typename».
, . (, fMap(fCurry(fCons).fApply(vXs), vObj.vYs)
â template
, typename
, «f», «v» «n» ).
â « ». - :
internal
; struct result
value::value
. - , ( , ), ( typedef
), , . - : .
.
value
, . , value::value
value1::value2
:
template <typename x> struct f { typedef internal::True uses_value1;
, uses_value1
, value1
value2
. - ãã¿ãŒã³ãã©ã¡ãŒã¿ãšããŠã®å¯å€é·ãã¿ãŒã³ãšæŽæ°ã¯èæ
®ãããŸããã
å®è£
ã®ãµããŒãã«å ããŠãå¿
èŠãªval
远å ã®çªå·ã®çš®é¡ïŒã®int
ãuint
ã...ïŒãšé
åïŒ[val]
ã[int]
ã[uint]
...ïŒãã¡ã¿ãã£ãŒã«ãã䜿çšããå Žåãtemplate
ãštypename
ã§äžèšã®åé¡ã解決ããå¿
èŠããããŸããæ°å€ã«ã¯äœãå¿
èŠãããŸãã;åãšãã¿ãŒã³ã«ã¯å¿
èŠã§ãã
ããã°ã©ã äŸ
äŸãšããŠãªã¹ããäœæããŸããã ã2ã€ã®æ¹æ³ã§åŠå®ãåããããããã¹ãŠã®å€ã以äžã«åºåãmain
ãŸãã // : my_list = Cons(One, Cons(One, Cons(Zero, Nil)')')'; negated_list = negate(my_list); negated_list2 = map(Not, my_list); impure { int main() { // : std::cout << "my list is "; impure print(my_list); std::cout << "negated list is "; impure print(negated_list); std::cout << "negated list is also "; impure print(negated_list2); } }
ããã°ã©ã ã¯æ¬¡ãåºåããŸãã my list is 1, 1, 0, negated list is 0, 0, 1, negated list is also 0, 0, 1,
ããã°ã©ã ã®ãœãŒã¹ã³ãŒãå
šäœ impure { #include <iostream> } One; Zero; Not (val x) = Zero; // Not (Zero) = One; // And(val x, val y); // x,y != One,Zero And And(val x, One) = x; // One - , val x - And(val x, Zero) = Zero; #type number = val; #type list = val; #type unary = number -> number; #type map_t = (unary, list) -> list; Nil; Cons(val x, val y) { head = x; tail = y; } // : negate (list list) = Cons(not_head, not_tail)' { h = list.head; not_head = Not(h); t = list.tail; not_tail = negate(t); } // - negate (Nil) = Nil; // map (unary f, list list) = Cons(new_head, new_tail)' { h = list.head; new_head = f(h); t = list.tail; new_tail = map(f, t); } // map (unary f, Nil) = Nil; print(val list) { head = list.head; tail = list.tail; impure { print() { impure print(head); std::cout << ", "; impure print(tail); } } } print(Zero) = impure { print() { std::cout << "0"; } } print(One) = impure { print() { std::cout << "1"; } } print(Nil) = impure { print() { std::cout << std::endl; } } my_list = Cons(One, Cons(One, Cons(Zero, Nil)')')'; negated_list = negate(my_list); negated_list2 = map(Not, my_list); impure { int main() { std::cout << "my list is "; impure print(my_list); std::cout << "negated list is "; impure print(negated_list); std::cout << "negated list is also "; impure print(negated_list2); } }
C ++ã§ã®ç¿»èš³åŸã®ã³ãŒã #include <iostream> struct One; struct Zero; template <typename x> struct Not { typedef Zero _value; }; template <> struct Not<Zero> { typedef One _value; }; template <typename x, typename y> struct And; template <typename x> struct And<x, One> { typedef x _value; }; template <typename x> struct And<x, Zero> { typedef Zero _value; }; struct Nil; template <typename x, typename y> struct Cons { typedef x head; typedef y tail; }; template <typename list> struct negate { typedef typename list::head h; typedef typename Not <h> ::_value not_head; typedef typename list::tail t; typedef typename negate <t> ::_value not_tail; typedef Cons <not_head, not_tail> _value; }; template <> struct negate<Nil> { typedef Nil _value; }; template <template <typename> class f, typename list> struct map { typedef typename list::head h; typedef typename f <h> ::_value new_head; typedef typename list::tail t; typedef typename map <f, t> ::_value new_tail; typedef Cons <new_head, new_tail> _value; }; template <template <typename> class f> struct map<f, Nil> { typedef Nil _value; }; template <typename list> struct print { typedef typename list::head head; typedef typename list::tail tail; print() { print <head> (); std::cout << ", "; print <tail> (); } }; template <> struct print<Zero> { print() { std::cout << "0"; } }; template <> struct print<One> { print() { std::cout << "1"; } }; template <> struct print<Nil> { print() { std::cout << std::endl; } }; typedef Cons <One, Cons <One, Cons <Zero, Nil> > > my_list; typedef typename negate <my_list> ::_value negated_list; typedef typename map <Not, my_list> ::_value negated_list2; int main() { std::cout << "my list is "; print <my_list> (); std::cout << "negated list is "; print <negated_list> (); std::cout << "negated list is also "; print <negated_list2> (); }
翻蚳è
ç§ã¯JavaScriptã§ç¿»èš³è
ãæžããŸããïŒãã®èšèªã倧奜ãã§ãç°¡åã«èããããŸãïŒããŒãµãŒãžã§ãã¬ãŒã¿ãŒãšããŠPEG.jsã䜿çšããŸãããèµ·åæã«ããã©ã³ã¹ã¬ãŒã¿ãŒïŒGitHub ã®èšèªããŒãžãåç
§ïŒã¯ãã³ãã³ãã©ã€ã³ãã©ã¡ãŒã¿ãŒãšããŠæå®ãããååã®ãã¡ã€ã«ãèªã¿åããçµæã®C ++ããã°ã©ã ããã¹ããstdoutã«åºåããŸãã node src/compile <>
翻蚳è
ãå€ããå°ãªããç²åŸããäœæ¥ããã°ã©ã ãæžããããšããã«ãç§ã¯ãã®ãã¹ãŠãGitHubã«æçš¿ãããžã§ãŒã¯ã®æ°åŠè
ã®ããã«ãã解決çããããŸãïŒããšå«ã³ãç§ã¯ãããžã§ã¯ãã®éçºã«ã»ãšãã©èå³ã倱ããŸãããç§ã¯äžèšã®åé¡ãã¿ã€ã/ãã³ã¬ãªãŒã®è¡šèšæ³ã亀äºã«ç€ºãããšã§è§£æ±ºããããšããŸããããããã«ã¯æ·±å»ãªå€åãšç¹°ãè¿ããã粟ç¥çã¹ãã¬ã¹ãå¿
èŠã§ãããèããŠãæºåãã§ããŠæ©èœããŠãããã®ãæã£ãŠããã®ã¯æ ã§ãããããã«ãæå€§ã®é©åæ§ã®ååã«éåããå¯èœæ§ããããŸãã远å ã®ã©ãããŒãšãããã䜿çšããããã®ã³ãŒãã¯ãæŸéã®åçŽãã®çŸãããæ®ºãããã³ãã¬ãŒãã®ãã¹ãã®å¶éãè¶
ããŠããã°ã©ã ãè¿ã¥ããŸãããããã£ãŠãç§ã¯æ èªã«ããã£ãŠããã誰ããèå³ãæã¡ãããããèšèªã®éçºã«è²¢ç®ããŠããããå¬ããã§ãã