- TOP
- ã¿ã°äžèЧ
- Haskell
Haskell
ã€ãã³ã
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
ãã¬ãžã³
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
æè¡ããã°
æ¬ããã°ã¯ 2026 幎 4 æ 17 æ¥ã«å
¬éããã Amazon Science Blog â Isabelle/HOL: The proof assistant behind the Nitro Isolation Engine â ã翻蚳ãããã®ã§ãã Isabelle/HOL ã¯ãæ°åŠçãªèšè¿°ã®è¡šçŸåãèªååãã¹ã±ãŒã©ããªãã£ã®ãã©ã³ã¹ã«ãã£ãŠãäžçåã®åœ¢åŒçã«æ€èšŒãããã¯ã©ãŠããã€ããŒãã€ã¶ãŒãå®çŸããŸããã 2025 幎㮠Amazon re:Invent ã«ã³ãã¡ã¬ã³ã¹ã«ãããŠãAmazon Web Services (AWS) 㯠Nitro Isolation Engine (NIE) ãçºè¡šããŸãããNIE ã¯ãã客æ§ã®ããŒã¿ã®ã»ãã¥ãªãã£ã確ä¿ããªãã AWS ã®ã客æ§ã«ãªãœãŒã¹ãæäŸãã圹å²ãæ
ããœãããŠã§ã¢ã¢ãžã¥ãŒã«ã§ããããã㊠AWS ã¯ã Isabelle/HOL ãšããå®çèšŒææ¯æŽç³» (proof assistant) ã䜿çšããŠããã® Isolation Engine ã®æ£åœæ§ãšã»ãã¥ãªãã£ä¿èšŒã圢åŒçã«æ€èšŒããããšãçºè¡šããŸãããäžçåã®åœ¢åŒçã«æ€èšŒãããã¯ã©ãŠããã€ããŒãã€ã¶ãŒãšããŠãNIE ã¯ã¯ã©ãŠãã»ãã¥ãªãã£ã®æ°ããæšæºãæã¡ç«ãŠãŠããŸãã Isabelle ã¯ããšããš ã±ã³ããªããžå€§åŠ ãš ãã¥ã³ãã³å·¥ç§å€§åŠ ã§éçºãããçŸåšã¯äžçäžã®æ©é¢ãå人ã«ããæ°å€ãã®ã³ã³ããªãã¥ãŒã·ã§ã³ãåã蟌ãã§ããŸãã å®çèšŒææ¯æŽç³»ãšã¯ã人éã®ãŠãŒã¶ãŒã圢åŒç蚌æãæ§ç¯ããã®ãæ¯æŽããèªååããŒã«ã§ãããã®å¯Ÿè±¡ã¯ãæ°åŠã®å®çããããŒããŠã§ã¢ããœãããŠã§ã¢ã·ã¹ãã ã®åŠ¥åœæ§ãŸã§ããããããã®ã«åã³ãŸããåºã䜿ãããŠããå®çèšŒææ¯æŽç³»ã¯ããã€ããããŸãããç§ãã¡ã Isabelle/HOL ãéžãã ã®ã¯ã衚çŸåãèªååã蚌æã®èªã¿ããããã¹ã±ãŒã©ããªãã£ã®ãã©ã³ã¹ãç§ãã¡ã®çšéã«æãé©ããŠããããã§ããããã¯å
·äœçã«ã©ãããããšãªã®ã§ãããã? ã³ã³ãã¥ãŒã¿ã«ããè«ççæšè« æ°åŠã«æ±ºãŸã£ãèšèªãšãããã®ã¯ãããŸããããããã°ã©ãã³ã°èšèªãèšç®ã¿ã¹ã¯ã衚çŸããã®ãšåãããã«ãæ°åŠçæšè«ã衚çŸããããã®èšèªãäœãããšãã§ããŸãããããŠãããã°ã©ãã³ã°èšèªã«è¡šçŸåãšããã©ãŒãã³ã¹ã®ãã¬ãŒããªããããããã«ãæ°åŠçèšèªã«ã衚çŸåãšèªååã®ããããã®ãã¬ãŒããªãããããŸãã圢åŒç蚌æã®æ§ç¯ã¯æéãããããæ¥µããŠæ ¹æ°ã®ããäœæ¥ã§ãããã (ããã«ã®äžã«è¹ãçµã¿ç«ãŠãäœæ¥ã«äŒŒãŠããŸã)ãèªååã¯äžå¯æ¬ ã§ãã 圢åŒç蚌æã®æ§ç¯ã¯ãããã«ã®äžã«è¹ãçµã¿ç«ãŠãäœæ¥ã«äŒŒãŠããŸãã峿 Œãªè«ççå¶çŽã®äžã§ããã¹ãŠã®éšåãæ£ç¢ºã«çµã¿ç«ãŠãªããã°ãªããŸãããIsabelle/HOL ã¯ããã®ç·»å¯ãªäœæ¥ãå¯èœã«ããããŒã«ãæäŸããŸãã æãåæ©çãªæ°åŠçèšèªã¯ããŒã«è«çã§ããããã¯ãANDãORãNOT ãšãã£ãè«çæŒç®åã®äžçã§ãããã®èšèªã¯éåžžã«ã·ã³ãã«ã§ããããã匷åãªèªåãœã«ããŒãååšããŸãã2016 幎ãã«ãŒãã®ãŒã¡ãã³å€§åŠã® Marijn Heule ææ (çŸåšã¯ Amazon Scholar ) ãšãã®ååãã¡ã¯ãæªè§£æ±ºã®æ°åŠçåé¡ã§ããããŒã«ã»ãã¿ãŽã©ã¹æ°åé¡ãããŒã«è«çã«ç¬Šå·åããèªåãœã«ããŒã䜿ã£ãŠã200 ãã©ãã€ããšãã å²äžæå€§ã®èšŒæ ãäœãäžããŸããã äžéè¿°èªè«ç ãšåŒã°ããããè±ããªæ°åŠçèšèªã§ã¯ãæŽæ°ãªã©ã®å¯Ÿè±¡é åã«ã€ããŠèªãããã®é åäžã®é¢æ°ãå®çŸ©ã§ããŸãããŸããããã¹ãŠã®ïœã«ã€ããŠãããïœãååšããããšãã éåå ã䞻匵ã«å«ããããšã§ãããŒã«è«çãè¶
ãã衚çŸãå¯èœã«ãªããŸãããã®çš®ã®èšèªã§ã¯ãã2 ãã倧ãããã¹ãŠã®çŽ æ°ã¯å¥æ°ã§ããããšãã£ãæã衚çŸã§ããŸãããŸããLewis Carroll ã«ããæ¬¡ã®å®çã蚌æããããšãã§ããŸãã ã¯ã«ããèžãã¢ãã«ã¯ããªããã¯ã«ããæã士å®ã¯ããªããç§ã®å®¶çŠœã¯ãã¹ãŠã¢ãã«ã§ãããããã«ãç§ã®å®¶çŠœã®äžã«å£«å®ã¯ããªãã ããããã»ãšãã©ã®äººã¯ãããã°ã©ãã³ã°ãšåãããã«åãå®çŸ©ã§ãããããã«åŒ·åãªæ°åŠçèšèªã奜ã¿ãŸãã é«éè«ç ã«ã¯ã Haskell ãªã©ã®é¢æ°åããã°ã©ãã³ã°èšèªã«èŠããããããªé¢æ°åããååšããŸããé«éè«çã¯äžéè¿°èªè«çãããã¯ããã«è±ãã§ãã æ° 1 ãå«ã¿ãå æ³ã«ã€ããŠéããŠãããã¹ãŠã®éåã¯ããã¹ãŠã®æ£ã®æŽæ°ãå«ã ããšãã£ãæã衚çŸã§ããŸããæ°åŠã®å€§éšåã衚çŸã§ããã»ã©è±ãã§ãããšèããããŠããŸãã æãè±ããªæ°åŠçèšèªã§ãã äŸååçè« ã§ã¯ãåãä»»æã®å€ããã©ã¡ãŒã¿ãšããŠåãããšããå¯èœã§ããäŸãã° T(i) ã®ããã«ã i ãæŽæ°ãšããããšãã§ããŸãããã®çš®ã®èšèªã§æãããç¥ãããŠããã®ã¯ Lean ãš Rocq ã§ãã äžéè¿°èªè«çã«ã¯åŒ·åãªèªåå®ç蚌æåšãååšããŸãããé«éè«çããã以äžã®èšèªã§ã¯ãå®å
šãªèªååã¯å©çšã§ããŸãããããã衚çŸåã®ä»£åã§ãã å®çèšŒææ¯æŽç³» ã䜿ãã°ããŠãŒã¶ãŒã¯éšåçãªèªååã®æ¯æŽãåããªãã察話çã«èšŒæãæ§ç¯ã§ããç¬èªã®èšŒææ¢çŽ¢ãã³ãŒãã£ã³ã°ããããšãå¯èœã§ããå®çèšŒææ¯æŽç³»ã¯ãè«çæ³åãžã®å³æ Œãªæºæ ã匷å¶ããŸããããã¯éåžžãå®çãäœæããæš©éãã³ãŒãã®éãããéšåã«ã®ã¿äžããã«ãŒãã«ã¢ãŒããã¯ãã£ã«ãã£ãŠå®çŸãããŸãã å®çèšŒææ¯æŽç³»ã¯ãéåžžã«å€§èŠæš¡ã«ãªãåŸã圢åŒç仿§ã®éå±€ã察話çã«éçºããããšããµããŒãããŸããäŸãã°ãNitro Isolation Engine (NIE) ã®æ€èšŒã¯ãGraviton-5 ããã»ããµã®ã¢ãŒããã¯ãã£ã®ä»æ§ããã€ããŒã³ãŒã«ã® Rust ã³ãŒããšãã®æ©èœçæ£åœæ§ããããŠèšŒæãã¹ãã»ãã¥ãªãã£ç¹æ§ã®ä»æ§ã®äžã«æãç«ã£ãŠããŸãã圢åŒç蚌æãæ§æãã 25 äžè¡ã®å€§éšåã¯ããããã®ä»æ§ãå ããŠããŸãã é«éè«çã¯ã坿¥ã«é¢é£ãã 2 ã€ã®å®çèšŒææ¯æŽç³»ã§ãã HOL ãš HOL Light ã§ãµããŒããããŠããã1990 幎代ããããŒããŠã§ã¢èšèšãæµ®åå°æ°ç¹ã¢ã«ãŽãªãºã ãçŽç²æ°åŠã®æ€èšŒã«äœ¿ãããŠããŸãããAWS ã®ã·ãã¢ããªã³ã·ãã«ã¢ãã©ã€ããµã€ãšã³ãã£ã¹ãã§ãã John Harrison 㯠HOL Light ãéçºããæå·ã¢ã«ãŽãªãºã ã®æé©åããŒãžã§ã³ãæ€èšŒããããšã§ãAmazon ã® Graviton2 ãããã«ãããããžã¿ã«çœ²åã® ããã©ãŒãã³ã¹ãæå€§ 94% åäž ãããŸããããã®ã³ãŒãã¯ç¹çްã§ãããç¶²çŸ
çãªãã¹ã㯠çŸå®çã§ã¯ãããŸãã ããã®ãããªéèŠãªãœãããŠã§ã¢ããããã€ããåã«åãåŸãææ®µã¯ãå®å
šãªæ©èœçæ£åœæ§ã®åœ¢åŒçæ€èšŒãããããŸããã§ãããããããããã§æ³šç®ãããã®ã¯ Isabelle/HOL ã§ãã Isabelle/HOL ã®æŠèŠ Isabelle/HOL ãšä»ã® HOL ã·ã¹ãã (ããããé«éè«çã«åºã¥ããŠããŸã) ã®æãç®ã«èŠããéãã¯ããã®ä»æ§èšè¿°èšèªãšèšŒæèšèªã§ããã»ãšãã©ã®å®çèšŒææ¯æŽç³»ã§ã¯ããŠãŒã¶ãŒã¯èšŒæãããããšãèšè¿°ããåŸãäžçš®ã®ã¢ã°ã©ãããã²ãŒã ã®ããã«ãå
ã®ãŽãŒã«ãäžé£ã®ãµããŽãŒã«ã«çœ®ãæããã³ãã³ããæ¬¡ã
ãšç¶ããŠãããŸããIsabelle ã§ã¯ (Lean ã§ãããçšåºŠã¯)ã蚌æèšèªã«ãã£ãŠæãŸããäžéãŽãŒã«ãæç€ºçã«æžãåºãããšãã§ããããã蚌æããã»ã¹ãããé©åã«å¶åŸ¡ã§ããããèªã¿ããã蚌æããã¥ã¡ã³ããåŸãããŸãã ãªã³ã©ã€ã³ã«ã¯å€ãã®äŸ ããããŸãã ãã®ä»ã® 泚ç®ãã¹ãæ©èœ ã¯ä»¥äžã®ãšããã§ãã Rust èšèªã®ããªãã®éšåã仿§ã«åã蟌ãããšãå¯èœã«ãã ãŠãŒã¶ãŒèšå®å¯èœãªããŒãµãŒ äŸãã° + ã«ãããŸããŸãªæ°å€åã ãã§ãªããã·ã³ã¯ãŒãããã®ä»ã®é©åãªæèã§ãèªç¶ãªæå³ãäžãããååã«åºã¥ãããªãŒããŒããŒãã®ããã® åã¯ã©ã¹ 仿§ã®éå±€ãå®çŸ©ãã蚌æã®äžã§ããããŸããŸãªæ¹æ³ã§è§£éã§ãã軜éãªã¢ãžã¥ãŒã«ã·ã¹ãã ã§ãã ãã±ãŒã« (locales) åçŽåãšåŸãåãé£éã«ããèšŒææ¢çŽ¢ãéããã匷å㪠çµã¿èŸŒã¿ã®èªåå ããã«åŒ·åãªå€éšã®èªååã«ã¯ã³ã¯ãªãã¯ã§ã¢ã¯ã»ã¹ã§ãã sledgehammer å®éã«ã¯åœã§ãã䞻匵ãç¹å®ããããã® åäŸçºèŠããŒã« é©åæ§ã®ãã¹ãã«äœ¿çšãããå®è¡å¯èœãªé«é仿§ããã® ã³ãŒãçæ NIE ã®æ€èšŒã«ããã£ãŠã¯ããŸã åé¢è«ç (separation logic) ãšåŒã°ããç¹åããèšèªã Isabelle/HOL ã®äžã«å®è£
ããããšããå§ããŸãããåé¢è«çã¯ãå
±æãªãœãŒã¹ãæäœããããã°ã©ã ã³ãŒãã®æ€èšŒã®ããã«èšèšããããã®ã§ããç§ãã¡ã¯ç¬èªã®èšŒæèªååãã³ãŒãã£ã³ã°ããçµã¿èŸŒã¿ã®èªååãæŽ»çšããŸããããã®ãããåé¢è«çã䜿ãã€ã€ãå¿
èŠã«å¿ããŠéåžžã®é«éè«çã䜿ãããšãã§ããŸãããIsabelle ã¯ãéåžžã«å·šå€§ãªãµããŽãŒã«ã«ã察åŠã§ããã»ã©å
ç¢ãã€å¹ççã§ããããšãããããŸãããåžè²©ã®ã©ãããããã䜿ã£ãŠã25 äžè¡ã®èšŒæã 30 åã§å®è¡ã§ããã®ã§ãã Isabelle/HOL ã®å¿çšäºäŸ NIE 以åã® Isabelle ã®å¿çšäºäŸãšããŠæãå°è±¡çãªã®ã¯ãããããåºã䜿ãããŠãããã€ã¯ãã«ãŒãã«ã§ãã seL4 ã®æ€èšŒ ã§ãããããã®èšŒæãæåã«çºè¡šãããæç¹ã§ã¯çŽ 25 äžè¡ã§ããããçŸåšã§ã¯ããã«é·ããªã£ãŠããŸããseL4 ã®éçºè
ãã¡ã¯ããã€ã¯ãã«ãŒãã«ã® C å®è£
ãæœè±¡ç仿§ã詳现åãããã®ã§ããããšã蚌æããã³ã¢æäœã®å®å
šãªæ©èœçæ£åœæ§ãå®çŸããŸããããããŠãæ€èšŒãããã³ãŒãéšåã§ã¯ãã°ãäžå芳枬ãããŠããŸããããã ããæªæ€èšŒã®éšåã圢åŒåã§ããªãäžéšã®åææ¡ä»¶ãã«ããŒããããã«ããã¹ãã¯äŸç¶ãšããŠéèŠãªåœ¹å²ãæãããŠããŸãã Isabelle ã¯ä»¥äžã®ãããžã§ã¯ãã§ã䜿çšãããŸããã ãšã©ãŒã®ç¹å®ãç¹ã«ãã®åã·ã¹ãã ã® å¥å
šæ§ã®èšŒæ ãç®çãšããã WebAssembly èšèªã®ã»ãã³ãã£ã¯ã¹ã®åœ¢åŒå Cogent ããã°ã©ãã³ã°èšèªã®ããã® æ€èšŒãã¬ãŒã ã¯ãŒã¯ ã®äœæ åæ£ç·šéã«äœ¿çšããããç«¶åã®ãªãã¬ããªã±ãŒãããŒã¿å (CRDT) ã®ã¢ã«ãŽãªãºã ã® æ£åœæ§ã®èšŒæ çŽç²æ°åŠã«ããã æ°å€ãã®çµæã®åœ¢åŒå æœè±¡ã¬ãã«ã§ã® æå·ãããã³ã«ã®æ€èšŒ Isabelle ã¯ç¡æã®ãªãŒãã³ãœãŒã¹ãœãããŠã§ã¢ã§ããã ããŠã³ããŒãããŠå©çš ã§ããŸããååãªã¡ã¢ãªãåãããã·ã³ã§ããã°ãäž»èŠãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãã¹ãŠã§åäœããŸãã èè
ã«ã€ã㊠Larry Paulson Larry Paulson ã¯ãã±ã³ããªããžå€§åŠã®èšç®è«çåŠã®åèªææã§ãããAmazon Scholar ã§ãã æ¬ããã°ã¯ Security Solutions Architect ã® äžå³¶ ç« å ã翻蚳ããŸããã
.images-row {width: 100% !important;} Developer Engagementãããã¯ã® @ikkou ã§ãã2026幎5æ22ã»23æ¥ã®2æ¥éã«ããããã«ãµãŒã«çŸœç°ç©ºæž¯ã§ãTSKaigi 2026ããéå¬ãããŸããã ZOZOã¯Gold SponsorãšããŠåè³ããã¹ãã³ãµãŒããŒã¹ãåºå±ããŸãããZOZOãTSKaigiã«åè³ããã®ã¯ä»åãåããŠã§ãã technote.zozo.com æ¬èšäºã§ã¯ãååã¯ZOZOã®Webããã³ããšã³ããšã³ãžãã¢ãæ°ã«ãªã£ãã»ãã·ã§ã³ã玹ä»ããŸããåŸåã§ã¯ãZOZOã®ã¹ãã³ãµãŒããŒã¹ã®æ§åãšå瀟ã®ããŒã¹ã«ãããã³ãŒãã£ããŒããåçäžå¿ã«å ±åããŸãã ZOZOã®Webããã³ããšã³ããšã³ãžãã¢ãæ°ã«ãªã£ãã»ãã·ã§ã³ éçºäœéšãå·Šå³ããã©ã€ãã©ãªã® API èšèš â GraphQL ã¹ããŒãæ§ç¯ã©ã€ãã©ãªããèãã ã颿°åããã°ã©ãã³ã°ããåè§£ãã.ts çŽç²æ§ã«ã€ã㊠åã§ãšãã§ã¯ãã衚ã ãã€ãã¹ããæžããïŒâãœãããŠã§ã¢éçºã«ãããå®å¿ãšäžå®ã«ã€ããŠèãã LLMæä»£ã®ãªãã¡ã¯ã¿ãªã³ã°æŠç¥ïŒAIãšãŒãžã§ã³ãã«ããæ®µéçã»å®å
šãªTSç§»è¡æ¹æ³ TypeScript ã®åã§å¯äœçšã®å®è¡é åºãå¶åŸ¡ãã ZOZOã®ã¹ãã³ãµãŒããŒã¹ã®çŽ¹ä» åè³äŒæ¥ããŒã¹ã®ã³ãŒãã£ããŒããŸãšã ãããã« ZOZOã®Webããã³ããšã³ããšã³ãžãã¢ãæ°ã«ãªã£ãã»ãã·ã§ã³ éçºäœéšãå·Šå³ããã©ã€ãã©ãªã® API èšèš â GraphQL ã¹ããŒãæ§ç¯ã©ã€ãã©ãªããèãã ssssota ã§ããizumin5210ããã®ã éçºäœéšãå·Šå³ããã©ã€ãã©ãªã® API èšèš â GraphQL ã¹ããŒãæ§ç¯ã©ã€ãã©ãªããèãã ãã玹ä»ããŸãã speakerdeck.com ãã®ã»ãã·ã§ã³ã§ã¯ãã¹ããŒããåæ
å ±ãããã«TypeScriptã®å®è£
ã«æ¥ç¶ããããšãã芳ç¹ã§ãæ¢åã©ã€ãã©ãªã®ã¢ãããŒãããã®é·çãæ·±ãŒãå
容ã§ãããåŒç€Ÿã§ã¯OpenAPIã䜿ã£ãŠããã±ãŒã¹ãéåžžã«å€ããããã«OpenAPIã¹ããŒããå®è£
ã«æ¥ç¶ãããã¯åŸã
ã«ããŠçºçããåé¡ã®1ã€ã§ãã ã»ãã·ã§ã³ã§ã¯GraphQLã«çŠç¹ãåœãŠãããŠããŸããããã¹ããŒãããå®è£
ãçæããã¹ããŒããã¡ãŒã¹ããã³ãŒãããã¹ããŒããçæããã³ãŒããã¡ãŒã¹ããã³ãŒããã¡ãŒã¹ãã®ãã¡Decoratorsã䜿ããã¿ãŒã³ãDSLçãªç¬èªã®builderãã¿ãŒã³ãèš3ãã¿ãŒã³ã«ã€ããŠè©äŸ¡ããŠããŸãããæ¯èŒã»è©äŸ¡è»žãšããŠã1.ã¹ããŒããšå®è£
ã®åé¢ã2.åæŽåæ§ã3.DBã¢ãã«ãšã®æ¥ç¶ãã®3軞ãçšããŠããŸãã ã¹ããŒããšå®è£
ã®åé¢ã«ã€ããŠã¯ãã¹ããŒããã¡ãŒã¹ããåªããŠããã®ã¯èšããŸã§ããããŸãããåé¢ãã匷ãã¢ãããŒã·ã§ã³ããªããã°åªå
床ã¯äœããªããŸããåæŽåæ§ã¯æ¡çšããã©ã€ãã©ãªã®type ergonomicã«äŸããŸãããã³ãŒããã¡ãŒã¹ããªDSL builderãã¿ãŒã³ã匷ãåŸåã«ãããŸããDBã¢ãã«ãšã®æ¥ç¶ã«ãããŠã¯GraphQLç¹æãšèŠãããšãã§ããŸãããã³ãŒããã¡ãŒã¹ããªDSL builderãã¿ãŒã³ã§åæŽååé¡ãšåãããŠè§£æ±ºã§ããããšã瀺åããŠããŸãã ã»ãã·ã§ã³ã®æåŸã«ã¯ãèªäœã®ã©ã€ãã©ãªã§ãã®ã®ã£ãããåããåãçµã¿ãšAIãçšããè©äŸ¡çµæã玹ä»ããŠããŸãããæ°ã«ãªãæ¹ã¯ã¹ã©ã€ããåãããŠç¢ºèªããŠã¿ãŠã¯ãããã§ããããã ç§èªèº«ãOpenAPIã¹ããŒããšå®è£
ã®æ¥ç¶ã«é¢ããŠé¢å¿ããããã©ã€ãã©ãªïŒ openapi-ts-hono ïŒãäœã£ãçµéšããéåžžã«å
±æã§ãããšããããããŸããããã¡ããGraphQLãšã¯ã®ã£ããããããŸãããã¹ããŒããšå®è£
ã®åé¢ãåæŽåæ§ãªã©ã¯æèŠãšããŠãã£ãŠããªããããæ¹ããŠèšèªåãããããšã§æ°ä»ãã®ããã»ãã·ã§ã³ã§ããã ã颿°åããã°ã©ãã³ã°ããåè§£ãã.ts www_REM_zzz ã§ããããŒã¿ãŒããã®ã ã颿°åããã°ã©ãã³ã°ããåè§£ãã.ts ãã玹ä»ããŸãã tsk-2026-aumy.vercel.app èªåã®è©±ã§ãããTypeScriptã«å
¥éããåã¯ScalaãæžããŠããçµéšããããŸããåœæã¯ã³ããæ¬ãšåŒã°ããæ¬ãšHaskellã®å
¬åŒããã¥ã¡ã³ããæ¥æ¬èªã§é¢æ°åããã°ã©ãã³ã°ã«å
¥éããå
¥å£ã§ãããObjectæåããã°ã©ãã³ã°ãšã¯å
šãå¥ã®äžçãããã£ãŠãããããªèãæ¹ã§ãé¢çœãããããèŠåŽãããéå»ããããŸãã ãã®ã»ãã·ã§ã³ã§ã¯ããããã颿°åããã°ã©ãã³ã°ãšã¯äœãªã®ãã®èãæ¹ã«è§ŠããªãããTypeScriptã§çã®é¢æ°åã¯ã§ããªãã®ãã«è§ŠããããŠããŸããåãTypeScriptã§çã®é¢æ°åãæžãããããã®ã«ãšæã£ãäžäººã§ãïŒOCamlæžãããšããã®ã¯äžæŠçœ®ããšããŠïŒãã¹ã©ã€ãã®äžã§èªããã颿°åããã°ã©ãã³ã°ã¯ãããæãã®ãœãããŠã§ã¢ãäœãããããšããã®ã¯æ¬è³ªçã ãªãšæããŸãããã€ãã€ãææ®µã«åŒã£åŒµãããŠããŸããšãããããã®ã§ãããå¿ã«çããŠããããã§ãã çŽç²æ§ã«ã€ã㊠ç¹ã«çŽç²æ§ã«ã€ããŠã®ãšããã¯Reactã§ãä»ã®ã©ã€ãã©ãªã§ãèªãããéšåã§ãããæå³ã®çŽç²æ§ã®éšåã¯æ©ãŸãããšæããããšãããã®ã§å
±æããŸããã // ãå¯äœçšã衚ãå€ããè¿ãã ãïŒçŽç²é¢æ°ïŒ function pureAlert ( msg : string ) { return [ "alert" , msg ] as const ; } // å¯äœçšã®å®è¡ã¯å¥ã®é¢æ°ã«å§ãã function executeAction ( action : readonly [ "alert" | "confirm" , string ] ) { switch (action[ 0 ]) { case "alert" : alert (action[ 1 ]); break ; case "confirm" : confirm (action[ 1 ]); break ; } } const actions = [ pureAlert( "hey" ), pureAlert( "bye" ) ] ; actions. forEach (( a ) => executeAction(a)); åŒçšïŒ https://tsk-2026-aumy.vercel.app/29 ãã®ãããªãäœããããã®å®£èšããšãå®è¡ããåé¢ãããŠããæžãæ¹ã¯æ®æ®µããã§ããããã¡ã³ããã³ã¹ãèãããšæ®æ®µããå®è·µããŠãããããšæããŸããã return ã¯ããã®é¢æ°ã®åŒã³åºãå
ïŒ= ç¶ç¶ïŒã«å€ãæž¡ããŠæ»ãããšããèãæ¹ã¯TSãæžããŠããŠãªããšãªãæããŠãããã®ãã¯ã£ãããšèšèªåãããŠã¹ãããªããæ°æã¡ã«ãªããŸããã åã§ãšãã§ã¯ãã衚ã () => T // ç¹ã«äœãèµ·ããªãçŽç²ãªåŠç () => Option< T > // 倱æãããåŠç () => Promise < T > // éåæåŠç ããã培åºãããš é¢æ°ã®åãèŠãã ãã§ãäœãèµ·ãããã»äœãèµ·ããªããããããã çŽç²ãªéšåãšå¯äœçšã®ããéšåãåã¬ãã«ã§åé¢ããã ãæ¯æãåŠçãèµ·ããããéšåãã ããç¹å®ããŠäºéå®è¡ãé²ãã ããã¯TypeScriptãå
ç¢ã«æžãããã§å®è·µããããšæããŸããã¡ããã©æ¥åã§ã䌌ãã·ãã¥ãšãŒã·ã§ã³ãããããšãæãåºããŠããŸãããã®é¢æ°ã¯å¯äœçšãæã€ãïŒããåœåïŒ execute , get , ! èšæ³ïŒã§ç€ºãã®ãçŸå®çãªå
¥å£ããªãšæããŸããã ãã€ãã¹ããæžããïŒâãœãããŠã§ã¢éçºã«ãããå®å¿ãšäžå®ã«ã€ããŠèãã ãžã³ïŒ @Jin_pro_01 ïŒã§ããèªåã®æ°ã«ãªã£ãã»ãã·ã§ã³ãšããŠã lacolacoãã ã®ã ãã€ãã¹ããæžããïŒâãœãããŠã§ã¢éçºã«ãããå®å¿ãšäžå®ã«ã€ããŠèãã ãã玹ä»ããŸãã docs.google.com ãã®ã»ãã·ã§ã³ã§ã¯ããã¹ããã©ã®ãããªæã«æžãã¹ããªã®ãããéçºè
ã®å®å¿ãšäžå®ããèµ·ç¹ã«åãçŽããlacolacoããã®æ°ã¥ãã®å
±æãåãã®æç€ºãèŠç¹ã®ææ¡ããããšããã»ãã·ã§ã³ã§ããã ã»ãã·ã§ã³ã®äžã§ã¯ãœãããŠã§ã¢ã®ä¿å®æ§ã®æ¬è³ªã¯ã倿Žå®¹ææ§ãã§ãããããã¯äºæç倿Žå®¹ææ§ïŒå€æŽããåã«æããäžå®ïŒãšçµéšç倿Žå®¹ææ§ïŒå€æŽãããäžã§å®éã«æããæå¿ãïŒã®äºå±€ã¢ãã«ãšããŠèŠãããšãã§ãããšããŠããŸããããã®äžã§ãã¹ãã¯ãã®äž¡æ¹ã«ãã£ãŒãããã¯ãè¿ãã»ã³ãµãŒã§ãããšãã倿Žåã«æããäžå®ããããªããããåãé€ãå®å¿ã®ããã«æžãã倿Žã®ããããã詊ãããæ§é ã«åé¡ãèŠã€ãã£ãããããªãèšèšãèŠçŽãããã«æžããšããäœç³»çãªæŽçããããŠããããšãŠãè峿·±ãã»ãã·ã§ã³ã§ããã èªåãåŸäºããŠããZOZOTOWNã§ã¯ãæ°èŠæ©èœã®å®è£
ãæ¢åæ©èœã®æ¹ä¿®ãšäžŠè¡ã§ãããã³ããšã³ããªãã¬ã€ã¹ãåããŒã ã§é²è¡ããŠããŸããZOZOTOWNã®çºå±ãæ¢ããã«éçºãé²ããäœå¶ã§ããäžæ¹ãèæ
®ãã¹ãããšãå€ããèªåã«ãšã£ãŠã¯æ¯èŒçãäºæç倿Žå®¹ææ§ããäœãç¶æ
ã ãšè¡šçŸã§ããããšã«æ°ã¥ããŸããããããŠããŸãã«ãã®ãäºæç倿Žå®¹ææ§ããé«ããããã®ãã¹ããžã®æè³äŸ¡å€ãé«ããšæããŸããã ããã«AIã䜿ã£ãŠã³ãŒãã£ã³ã°ãããŠããæä»£ã«å
¥ããéçºã®çç£éãå¢ããäžæ¹ã§ãèªåãçŽæ¥æžããŠããªãã³ãŒããæ§é ãšã®è·é¢ã¯åºãã£ãŠãããŸãããã®è·é¢ã¯æ°ããªäžå®ãã€ãŸãäºæç倿Žå®¹ææ§ã®äœäžã«ãã€ãªãããšæããŠããŸããã ãããã倿Žã®ååŸã§ãæ¯ãèããå€ãã£ãŠããªãããšããæ
ä¿ãããã®äžå®ãåãé€ãã»ã³ãµãŒãšããŠã®ãã¹ãã®äŸ¡å€ã¯ãAIæä»£ã«ãããŸããŸãé«ãŸã£ãŠããã®ã ãšèããŸããã æå€§ã®åç©«ã¯ããã¹ããæžãç®çãããœãããŠã§ã¢ããœããã§ããç¶ããããã®ã倿Žå®¹ææ§ã®ã»ã³ãµãŒããšèª¬æã§ããããã«ãªã£ãããšã§ãããã¹ãã¯ãããŸã§ææ®µã®1ã€ãšæãã€ã€ãZOZOTOWNããœããã§ããç¶ããããã«ãä»ã«äœãã§ããããèããŠãããããšæããŸããã LLMæä»£ã®ãªãã¡ã¯ã¿ãªã³ã°æŠç¥ïŒAIãšãŒãžã§ã³ãã«ããæ®µéçã»å®å
šãªTSç§»è¡æ¹æ³ ããããïŒ @iimokeenpi ïŒã§ããã LLMæä»£ã®ãªãã¡ã¯ã¿ãªã³ã°æŠç¥ïŒAIãšãŒãžã§ã³ãã«ããæ®µéçã»å®å
šãªTSç§»è¡æ¹æ³ ãã«ã€ããŠç޹ä»ããŸãã speakerdeck.com ãã®ã»ãã·ã§ã³ã¯ãJSã®ã³ãŒããAIãšãŒãžã§ã³ãã䜿ãå®å
šã«TSã«ç§»è¡ãããšãããã®ã§ãããããããJSããTSãžã®ç§»è¡ã®ã¿ãªããæ¥åžžçãªãªãã¡ã¯ã¿ãªã³ã°ã«ãããŠã掻çšã§ããããªããŠããŠãè©°ãŸã£ãŠããŸããã ç¹ã«èªåãèå³ãæã£ãéšåãšããŠã¯âtest-firstãããŒâãšâ圹å²ããšã«ãµããšãŒãžã§ã³ããåãåºãâã®2ã€ããããŸããAIãšãŒãžã§ã³ãã®äœ¿çšæç¡ã«ããããããªãã¡ã¯ã¿ãªã³ã°ã®éã«ãã°ã¬ã«ã¯çްå¿ã®æ³šæãæã£ãŠè¡ã£ãŠãããããšããã§ããããã§âtest-firstãããŒâãšããã®ã¯ããã°ã¬ã®é²æ¢çãšããŠã广ãé«ãAIãšãŒãžã§ã³ããšã®çžæ§ãããªãè¯ããªãšæããŸããã ãããŠâ圹å²ããšã«ãµããšãŒãžã§ã³ããåãåºãâãšããç¹ã«é¢ããŠã§ããèªåã¯åºæ¬çã«å
šãŠOpusã§ä¹ãåãããšããŠããã®ã§ãããæ¶è²»ããŒã¯ã³ã®å¹çãæéçãªå¹çã®é¢ã§ãæãããããšãå€ã
ãããŸãããªã®ã§åœ¹å²ããšã«ãµããšãŒãžã§ã³ããåãåºããã¢ãã«ã䜿ãåããããšã¯ããã«ã§ãå®è·µããããšæããŸããã TypeScript ã®åã§å¯äœçšã®å®è¡é åºãå¶åŸ¡ãã äœè€ã§ããç§ãå°è±¡ã«æ®ã£ãã»ãã·ã§ã³ã¯ã TypeScript ã®åã§å¯äœçšã®å®è¡é åºãå¶åŸ¡ãã ãã§ãã speakerdeck.com Branded Typeã¯ã UserId ãš ProductId ãåºå¥ããããã®ã¿ã°ä»ãããããã«ãã䜿ããªããšæã£ãŠããŸããããType-State Patternã䜿ãã°ãããå®è¡é åºã®å¶åŸ¡ã«è»¢çšã§ããŸããTypeScriptã®åã·ã¹ãã ã§ãããŸã§è¡šçŸã§ããã®ããšãåã«å¯ŸããèªèãæŽæ°ãããŸããã å ããŠé
åçãªã®ããã©ã€ãã©ãªäŸåãŒãã§æ¢åã³ãŒãã«èãå
¥ããããç¹ã§ããEffect-TSãXStateã¯åŒ·åã§ããå°å
¥ã³ã¹ãã¯é«ãã§ããType-Stateãã¿ãŒã³ãªãå®ãããç®æã ãã«ãã³ãã€ã³ãã§é©çšã§ããŸãã å®éã getServerSideProps å
ã«ãããªããŒã·ã§ã³âååŸâå å·¥ãã®ãããªå®è¡é åºãå®ããªããã°ãªããªãåŠçãããããããŸã§ã¯AIã®ã«ãŒã«ãéçšäžã®èŠçŽã«é ŒããããåŸãŸããã§ãããåã§å¶åŸ¡ã§ããããã«ãªãã°ãã³ãŒãã¬ãã¥ãŒãå±äººçãªæ³šæã«äŸåããããšãã£ã¿äžã§ãã¹ãå³åº§ã«æ€åºã§ããŸããèªåã®ããŒã ã«å°å
¥ã§ããªããå®è·µããããšæããããŒã¯ã§ããã ãµã³ãã«ã³ãŒã㯠GitHubã§å
¬éãããŠããŸã ãæ¢åã©ã€ãã©ãªãšã®æ¯èŒå®è£
ãå«ãŸããŠããã®ã§ããã²æå
ã§åãããŠã¿ãŠãã ããã ZOZOã®ã¹ãã³ãµãŒããŒã¹ã®çŽ¹ä» ZOZOã®ã¹ãã³ãµãŒããŒã¹ãšWebããã³ããšã³ããšã³ãžãã¢ãã¡ ZOZOã®ã¹ãã³ãµãŒããŒã¹ã§ã¯ã Google I/O 2026ããåž°åœããã°ããã®ZOZOããã³ããšã³ããšã³ãžã㢠ããã¯ãªãŒã ssssota ã«ææŠïŒ ããšé¡ããTypeScript & JavaScript Quizãã¡ã€ã³ã³ã³ãã³ããšããŠæäŸããŸãããæ¥æ¿ããã§å
š10åãããŒã¹ã«ã¯ãã®æ¥ã®ã¯ã€ãºãã1åã ãæ²ç€ºããŸããã TypeScript & JavaScript Quiz Day 1 & Day 2 ZOZOããŒã¹ã§ã¯ #GoogleIO ããåž°åœããã°ããã® Web ããã³ããšã³ã ããã¯ãªãŒã @ssssotaro ãèãã JavaScript & TypeScript Quiz ã宿œäžã§ãïŒé£æåºŠã¯é«ãïŒãã²ææŠããŠãã ããïŒ #TSKaigi pic.twitter.com/7K9ZTt22Qq — ZOZO Developers (@zozotech) 2026幎5æ22æ¥ ïŒŒTSKaigi 2026 æçµæ¥ïŒ 仿¥ãã¯ã€ãºäŒç»ãéå¬ããŠããŸãïŒæšæ¥ãšã¯ç°ãªãåé¡ã§ã仿¥ã¯ç¹å
žãã²ãããããããªã£ãŠããŸãïŒ ãªãªãžãã«æŽæ¿¯ãããããçšæããŠããŸãã®ã§ããã²ãåå ãã ããïŒ #TSKaigi pic.twitter.com/QwR6v2F96t — ZOZO Developers (@zozotech) 2026幎5æ23æ¥ é£ããïŒããšããããšã話é¡ã«ãªãããšãŠãå€ãã®æ¹ã«ææŠããŠããããŸãããé£ããã®ã¯äœåè
ã®æå³éãã§ããããã®ãé£ããããšããããšãåé¿ãåŒã³ã楜ããã§ããããã®ã§ã¯ãªãã§ããããã No Bugs, Just Clean. ãšããã¡ãã»ãŒãžã®èŸŒããããç¹è£œããã«ãã£ã®æŽæ¿¯ããã ã¯ã€ãºã«ææŠãã7åä»¥äžæ£è§£ããæ¹ã«ã¯ç¹è£œããã«ãã£ã®ãæŽæ¿¯ããããããæž¡ãããŸããïŒDay 2ã¯3åä»¥äžæ£è§£ããæ¹ã«å€æŽïŒã Day 1ãDay 2ã®7åä»¥äžæ£è§£è
ãŸããäžäœæ£è§£è
ã®çããã«ã¯ãªãŒããŒããŒãã«ããã³ãã«ããŒã ãªã©ãæžããŠããããŸããã2æ¥éãéããŠã®å
šåæ£è§£è
ã¯ãDay 1ã @uhyo_ ãããš @vaaaaanquish ããã®2åãDay 2ã @U3Qc9 ããã®1åã ãã§ãããæ¹ããŠå
šåæ£è§£ããã§ãšãããããŸãïŒ ãã®TypeScript & JavaScript Quizã«é¢ãã解説èšäºãå¥èšäºãšããŠå
¬éããŠããŸãããã®ã¯ã€ãºã®çããæ°ã«ãªããšããæ¹ã¯ãã¡ãããããäžåºŠãã®ã¯ã€ãºã«ææŠããããåœæ¥ã§ããªãã£ãã®ã§ææŠãããïŒããšããæ¹ããã²ã芧ãã ããã techblog.zozo.com 10åã»ãã·ã§ã³ã«ç»å£äžã®ããã¯ãªãŒã ssssota ãã®é£åæãã®ã¯ã€ãºãäœåããããã¯ãªãŒãã®ssssotaã¯Day 2ã«ã ReactãšSvelteã®ãã®å
ãRipple-TS ããšããã¿ã€ãã«ã§10åã»ãã·ã§ã³ã«ãç»å£ããŠããŸãããã¡ããããããŠã芧ãã ããã speakerdeck.com åè³äŒæ¥ããŒã¹ã®ã³ãŒãã£ããŒããŸãšã ãžã³ïŒ @Jin_pro_01 ïŒã§ããã»ãã·ã§ã³ãèŠãããèªç€ŸããŒã¹ã«ç«ã£ããããŠããåéã«TSKaigi 2026ã®å
šåè³äŒæ¥ããŒã¹ãåã£ãŠããŸãããåœæ¥ã®äŒå Žã®æ§åãæãåºããªãããå瀟ã®åæ§ãé°å²æ°ã®åºããã¶ã€ã³ã»çããªãããã²ã芧ãã ããã ãŠã§ã«ã¹ããããã / @WealthNavi_Tech AVITAããã Dress Codeããã / @dresscode_com Hacobuããã / @MHacobu sattoããã / @satto_ai_agent ã¢ãµã€ã³ããã / @ASSIGN_dev ã¬ãã¬ãžãŒãºããã PLAINERããã / @plainer_inc ãããããŒããã / @bitkey_dev UPSIDERããã / @upsider_inc ããŒãªãŒããã / @nealle_pr LayerXããã / @LayerX_tech ãšããªãŒããã / @every_engineer ã¹ãªãŒã·ã§ã€ã¯ããã / @3shake_Inc ããã¢ã¢ããã / @meetsmore Ubieããã / @UbieCorp_JP Nstockããã / @Nstock_jp ããã¬ã€ããããã / @PLAID_Tech ãããŒã¯ããã©ã¹ããã / @GeekJapan1 ãŠã©ã³ããããªãŒããã / @wantedly_dev ãµã€ããŠãºããã / @cybozuinsideout ãã¯ã³ãŽããã / @dwango_tech CodeRabbitããã / @Coderabbitaija ã·ã§ã«ããã»ã¢ã³ããã»ã«ã³ããããŒããã ãã¡ã€ã³ãã£ããã / @findy_code ãã£ããããã / @dip_developers RightTouchããã / @righttouch_dev Gaji-Laboããã / @gaji_labo ã¹ã¿ã¡ã³ããã / @stmn_eng TOKIUMããã / @TOKIUM_Dev ã«ãªãããããã / @kaonavi_jp ãã€ã©ãŒããã / @TailorERP_JP KINTOãã¯ããã·ããŒã¹ãããã / @KintoTech_Dev MOSHããã / @MOSHinc_jp çããç
§ããŠããããŠããŠãããŠãããããŠããã£ãã§ãïŒããååããã ããçããæ¬åœã«ããããšãããããŸããïŒ ãããã« TSKaigi 2026 åè³äŒæ¥äžèЧ TSKaigiãžã®ååè³ãéããŠãZOZOã®ããšãå°ãã§ãæ¥å Žè
ã®çããŸã«äŒãã£ãŠããã°å¬ããã§ããã¿ãªããŸãããããšãããããŸããïŒ TSKaigi 2026ããã£ãããšããŠZOZOã®Webããã³ããšã³ããšã³ãžãã¢ã«èå³ãæãããæ¹ã¯ãæè¡ã¹ã¿ãã¯ãªã©ããŸãšãŸã£ãããŒãžããã²ã芧ãã ããã techblog.zozo.com ZOZOã§ã¯ãäžç·ã«ãµãŒãã¹ãäœãäžããŠãããæ¹ãåéäžã§ãããèå³ã®ããæ¹ã¯ã以äžã®ãªã³ã¯ãããã²ãå¿åãã ããã corp.zozo.com
ããã«ã¡ã¯ãã¢ããã¡ã¯ãšã³ãžãã¢ã® id:knj-mf ã§ãã ä»å㯠TypeScript ã®åã¬ãã«ããã°ã©ãã³ã°ã§ã¡ãã£ãšé¢çœããã®ãäœã£ãã®ã§ç޹ä»ããããšæããŸãã äœãäœã£ãã®ïŒ TypeScript ã®åã¬ãã«ããã°ã©ãã³ã°ã¯ãäºæ³ã«åããŠæ§ã
ãªãã®ãå®è£
ã§ããŠããŸãããšã§æåã ã£ããããŸãã type-challenges ã®ããã«ããããã¯æ®éã®ããã°ã©ãã³ã°ã§å®è£
ãããã®ã§ã¯ïŒããšæã£ãŠããŸããããªãã®ãŸã§å®è£
ã§ããŠããŸããŸããããã§ãäœã£ãŠã¿ããã®ãäžèšã«ãªããŸãã æ©éãåäœã玹ä»ããŸãããã®ãã㪠Brainf**k ããã°ã©ã ã®æåååã⊠ãã®ããã«ãåèšç®äžã§è§£éãããŠããŸãïŒãšãããã®ã§ãã ããçšåºŠã®åœ¢ã«ãªããã®ã¯ã§ããã®ã§ããã®èšäºã§ã¯ãåã¬ãã«ããã°ã©ãã³ã°ãšæžãå³ã®è¿ã (å人差ããããŸã) Haskell å®è£
ãšç
§ãããªãããã©ã®ããã«èããŠãã®ãåããå®è£
ããŠãã£ãã®ãã玹ä»ããŸãã cwd-k2/bf-in-type ã®ãªããžã㪠ã«å®è£
ãããã®ã§ãæ°ã«ãªãæ¹ã¯æå
ã§åäœãå®è£
ãèŠãŠã¿ãŠãã ããã Brainf**kïŒ ãã£ã 8 ã€ã®åœä»€ãããªãé£èªããã°ã©ãã³ã°èšèªã§ããèšèªã®ä»æ§ãšããŠããªãåçŽæå¿«ã§ã¯ãããŸããããã¥ãŒãªã³ã°å®å
šãšããŠç¥ãããŠããŸãã(ã¡ãã£ãšäŒæ¥ã®å
¬åŒããã°ã«ã¯èŒãã¥ãã衚èšãå«ãã®ã§ãä»å㯠** ãšãã颚ã«äŒããããŠããã ããŸãâŠ) èŠçŽ ãšããŠã次㮠4 ã€ã®ãã®ãæã¡ãŸãã èŠçŽ å
容 ããã°ã©ã ããŒã å®è¡ããããã°ã©ã å ã¡ã¢ãªããŒã å€ãèšé²ããã»ã«ã®å ããã°ã©ã ãã€ã³ã¿ çŸåšåç
§ããŠããããã°ã©ã åœä»€åäžã®äœçœ® ã¡ã¢ãªãã€ã³ã¿ çŸåšåç
§ããŠããã¡ã¢ãªããŒãã®äœçœ® 8 ã€ã®åœä»€ã¯æ¬¡ã®ãããªåçŽãªãã®ã§ãã åœä»€ å
容 > ã¡ã¢ãªãã€ã³ã¿ãã€ã³ã¯ãªã¡ã³ãïŒæ¬¡ã®ã»ã«ãžïŒ < ã¡ã¢ãªãã€ã³ã¿ããã¯ãªã¡ã³ãïŒåã®ã»ã«ãžïŒ + çŸåšã»ã«ã®å€ãã€ã³ã¯ãªã¡ã³ã - çŸåšã»ã«ã®å€ããã¯ãªã¡ã³ã . çŸåšã»ã«ã®å€ã ASCII æåãšããŠåºå , 1 ãã€ãèªã¿èŸŒã¿ãçŸåšã»ã«ãžæ ŒçŽ [ çŸåšã»ã«ã 0 ãªãã察å¿ãã ] ã®çŽåŸãžãžã£ã³ã ] çŸåšã»ã«ã 0 ã§ãªããã°ã察å¿ãã [ ã®çŽåŸãžãžã£ã³ã ãã£ãããããã°ã©ã ããŒãäžã«èšèŒããã 8 ã€ã®åœä»€ã®åãé æ¬¡å®è¡ããªããã¡ã¢ãªããŒãã®å€ãæžãæãã€ã€ãé©å® I/O ããŠãã圢ã®ããã°ã©ãã³ã°èšèªã«ãªããŸãã å®éã® Brainf**k ããã°ã©ã ãã®ãã®ã¯ãŸã£ããå®çšæ§ããªãã®ã§ããããã®ç°¡åãªåœä»€ã»ãããããªãèšèªåŠçç³»ã®å®è£
ã«ã¯æè²ç䟡å€ããããŸããçµæ§æžããŠã¿ãããšããããšãããšã³ãžãã¢ã®æ¹ãå€ãã®ã§ã¯ãªãã§ããããã TypeScript ã®åã¬ãã«ããã°ã©ãã³ã° ãšããã§ãTypeScript ã«ã¯ (TypeScript ã«éããŸããã) åã¬ãã«ããã°ã©ãã³ã°ããããŸããæ¬åœã«åçŽãªäŸã ãšãäžèšã®ãããªãã®ã§ãã type ExtendsObject < T > = T extends object ? true : false ãããäœãããŠããã®ããšãããšãåãã§ãã¯ã®éã«å®æœãããåèšç®ãå®è£
ããŠãããšããããšã§ããäžèšã®ãããªæ¡ä»¶åå²ãªã©ã®ããžãã¯ãåã¬ãã«ã§è§£æ±ºãããŠããŸããšããããšã§ããã ãã®åã¬ãã«ããã°ã©ãã³ã°ãªã®ã§ããã衚çŸåã¯ããŠããããã¥ãŒãªã³ã°å®å
šãªç³»ã«ãªã£ãŠããŸã£ãŠãããšã®ãã£ã±ãã®è©å€ã§ãã åããåãæ°ãã«èšç®ã§ããŠããŸããšããããšã¯âŠ æ¥œããããã°ã©ãã³ã°ã®æéã®å§ãŸãã§ããã å®è£
æ¹é é·ããªã£ãŠããŸãã®ã§ã以éã§ã¯ Brainf**k ã BF ãšèšèŒããããšã«ããŸãã BF åŠçç³»ãåã¬ãã«ã«èœãšã蟌ãã«ããã£ãŠã次㮠4 ã€ã®èŠçŽ ã«åããŠèããŸãã ããŒãæ§é äœ ( Tape ) â ã¡ã¢ãªã»ããã°ã©ã ãå
±éããŠè¡šçŸããããŒã¿æ§é çŸåšäœçœ®ãæã¡ã€ã€ãååŸã«ç§»åããèœåãæã€ è©äŸ¡åš ( Runner ) â ã¡ã¢ãªããŒããšããã°ã©ã ããŒããæããå®è¡ç¶æ
ã¡ã¢ãªãå€åããã€ã€ããã°ã©ã ãã€ã³ã¿ãç§»åãããããåæã«æ±ã ã¢ã¯ã·ã§ã³ ( Action ) â 1 ã¹ãããå®è¡ã®çµæãšããŠå€çã«èŠæ±ãã广 (ãªã«ãããªã / å
¥å / åºå / çµäº) è©äŸ¡ã«ãŒã ( Exec ) â ã¢ã¯ã·ã§ã³ãè§£éããŠè©äŸ¡åšãåããå
¥åãæ¶è²»ãã€ã€åºåãèç©ããã¡ã€ã³ã«ãŒã åã¬ãã«ããã°ã©ãã³ã°ã§ã¯å¯äœçšãçŽ çŽã«æžããªããããå
¥åºåããã¢ã¯ã·ã§ã³åããšããŠããŒã¿ã«èœãšããŠãããå€åŽã®ã«ãŒãã§ãããè§£éãã圢ã«ããã®ããã€ã³ãã§ãã以éããã®é ã§åèŠçŽ ã®å®è£
ãèŠãŠãããŸãã ãŸããé©å®åèå®è£
ãšã㊠Haskell ã®å®è£
ãåãããŠç€ºããŠããŸãã TypeScript å®è£
㯠v5.4 以éã§åäœç¢ºèªããŠããŸãã å®è£
äžã®å¶çŽ å¶çŽãšããŠãå®è£
ã¬ãã«ã«å¹ããŠãããã®ããããŸããæ°å€ã§ã®æŒç®ãæ°å€âæåã®å€æãåºæ¬çã«ã§ããªãããšãããã®ã§ããäžå¯èœã§ã¯ãªãã§ãããã¿ãã« (åã¬ãã«é
å) ã® length ãåããããªå®è£
ã«ãªããã¡ãªã®ã§ãŸãããã©ããªããŸãã ä»å㯠ASCII ç¯å²ã§ã€ã³ã¯ãªã¡ã³ãã»ãã¯ãªã¡ã³ããèããã ããªã®ã§ãæ°åãã§èª€éåãããšãã§ããŸãã NumToCharMap[65] ã®ããã«åç
§ãããš 'A' ãšããåã«è§£æ±ºãããããšããããããå®çŸ©ããŸããã æ°å€æå倿ãã€ã³ã¯ãªã¡ã³ãã»ãã¯ãªã¡ã³ããããã®å®è£
export type NumToCharMap = [ '\x00' , '\x01' , '\x02' , '\x03' , '\x04' , '\x05' , '\x06' , '\x07' , '\x08' , '\x09' , '\x0A' , '\x0B' , '\x0C' , '\x0D' , '\x0E' , '\x0F' , '\x10' , '\x11' , '\x12' , '\x13' , '\x14' , '\x15' , '\x16' , '\x17' , '\x18' , '\x19' , '\x1A' , '\x1B' , '\x1C' , '\x1D' , '\x1E' , '\x1F' , '\x20' , '\x21' , '\x22' , '\x23' , '\x24' , '\x25' , '\x26' , '\x27' , '\x28' , '\x29' , '\x2A' , '\x2B' , '\x2C' , '\x2D' , '\x2E' , '\x2F' , '\x30' , '\x31' , '\x32' , '\x33' , '\x34' , '\x35' , '\x36' , '\x37' , '\x38' , '\x39' , '\x3A' , '\x3B' , '\x3C' , '\x3D' , '\x3E' , '\x3F' , '\x40' , '\x41' , '\x42' , '\x43' , '\x44' , '\x45' , '\x46' , '\x47' , '\x48' , '\x49' , '\x4A' , '\x4B' , '\x4C' , '\x4D' , '\x4E' , '\x4F' , '\x50' , '\x51' , '\x52' , '\x53' , '\x54' , '\x55' , '\x56' , '\x57' , '\x58' , '\x59' , '\x5A' , '\x5B' , '\x5C' , '\x5D' , '\x5E' , '\x5F' , '\x60' , '\x61' , '\x62' , '\x63' , '\x64' , '\x65' , '\x66' , '\x67' , '\x68' , '\x69' , '\x6A' , '\x6B' , '\x6C' , '\x6D' , '\x6E' , '\x6F' , '\x70' , '\x71' , '\x72' , '\x73' , '\x74' , '\x75' , '\x76' , '\x77' , '\x78' , '\x79' , '\x7A' , '\x7B' , '\x7C' , '\x7D' , '\x7E' , '\x7F' , ] & { [ i: number ] : ' \x00 ' } ; export type CharToNumMap = { '\x00' : 0 x00 , '\x01' : 0 x01 , '\x02' : 0 x02 , '\x03' : 0 x03 , '\x04' : 0 x04 , '\x05' : 0 x05 , '\x06' : 0 x06 , '\x07' : 0 x07 , '\x08' : 0 x08 , '\x09' : 0 x09 , '\x0A' : 0 x0A , '\x0B' : 0 x0B , '\x0C' : 0 x0C , '\x0D' : 0 x0D , '\x0E' : 0 x0E , '\x0F' : 0 x0F , '\x10' : 0 x10 , '\x11' : 0 x11 , '\x12' : 0 x12 , '\x13' : 0 x13 , '\x14' : 0 x14 , '\x15' : 0 x15 , '\x16' : 0 x16 , '\x17' : 0 x17 , '\x18' : 0 x18 , '\x19' : 0 x19 , '\x1A' : 0 x1A , '\x1B' : 0 x1B , '\x1C' : 0 x1C , '\x1D' : 0 x1D , '\x1E' : 0 x1E , '\x1F' : 0 x1F , '\x20' : 0 x20 , '\x21' : 0 x21 , '\x22' : 0 x22 , '\x23' : 0 x23 , '\x24' : 0 x24 , '\x25' : 0 x25 , '\x26' : 0 x26 , '\x27' : 0 x27 , '\x28' : 0 x28 , '\x29' : 0 x29 , '\x2A' : 0 x2A , '\x2B' : 0 x2B , '\x2C' : 0 x2C , '\x2D' : 0 x2D , '\x2E' : 0 x2E , '\x2F' : 0 x2F , '\x30' : 0 x30 , '\x31' : 0 x31 , '\x32' : 0 x32 , '\x33' : 0 x33 , '\x34' : 0 x34 , '\x35' : 0 x35 , '\x36' : 0 x36 , '\x37' : 0 x37 , '\x38' : 0 x38 , '\x39' : 0 x39 , '\x3A' : 0 x3A , '\x3B' : 0 x3B , '\x3C' : 0 x3C , '\x3D' : 0 x3D , '\x3E' : 0 x3E , '\x3F' : 0 x3F , '\x40' : 0 x40 , '\x41' : 0 x41 , '\x42' : 0 x42 , '\x43' : 0 x43 , '\x44' : 0 x44 , '\x45' : 0 x45 , '\x46' : 0 x46 , '\x47' : 0 x47 , '\x48' : 0 x48 , '\x49' : 0 x49 , '\x4A' : 0 x4A , '\x4B' : 0 x4B , '\x4C' : 0 x4C , '\x4D' : 0 x4D , '\x4E' : 0 x4E , '\x4F' : 0 x4F , '\x50' : 0 x50 , '\x51' : 0 x51 , '\x52' : 0 x52 , '\x53' : 0 x53 , '\x54' : 0 x54 , '\x55' : 0 x55 , '\x56' : 0 x56 , '\x57' : 0 x57 , '\x58' : 0 x58 , '\x59' : 0 x59 , '\x5A' : 0 x5A , '\x5B' : 0 x5B , '\x5C' : 0 x5C , '\x5D' : 0 x5D , '\x5E' : 0 x5E , '\x5F' : 0 x5F , '\x60' : 0 x60 , '\x61' : 0 x61 , '\x62' : 0 x62 , '\x63' : 0 x63 , '\x64' : 0 x64 , '\x65' : 0 x65 , '\x66' : 0 x66 , '\x67' : 0 x67 , '\x68' : 0 x68 , '\x69' : 0 x69 , '\x6A' : 0 x6A , '\x6B' : 0 x6B , '\x6C' : 0 x6C , '\x6D' : 0 x6D , '\x6E' : 0 x6E , '\x6F' : 0 x6F , '\x70' : 0 x70 , '\x71' : 0 x71 , '\x72' : 0 x72 , '\x73' : 0 x73 , '\x74' : 0 x74 , '\x75' : 0 x75 , '\x76' : 0 x76 , '\x77' : 0 x77 , '\x78' : 0 x78 , '\x79' : 0 x79 , '\x7A' : 0 x7A , '\x7B' : 0 x7B , '\x7C' : 0 x7C , '\x7D' : 0 x7D , '\x7E' : 0 x7E , '\x7F' : 0 x7F , } & { [ k : string ]: 0 x00 ; } ; export type DecrementMap = [ 0 x7F , 0 x00 , 0 x01 , 0 x02 , 0 x03 , 0 x04 , 0 x05 , 0 x06 , 0 x07 , 0 x08 , 0 x09 , 0 x0A , 0 x0B , 0 x0C , 0 x0D , 0 x0E , 0 x0F , 0 x10 , 0 x11 , 0 x12 , 0 x13 , 0 x14 , 0 x15 , 0 x16 , 0 x17 , 0 x18 , 0 x19 , 0 x1A , 0 x1B , 0 x1C , 0 x1D , 0 x1E , 0 x1F , 0 x20 , 0 x21 , 0 x22 , 0 x23 , 0 x24 , 0 x25 , 0 x26 , 0 x27 , 0 x28 , 0 x29 , 0 x2A , 0 x2B , 0 x2C , 0 x2D , 0 x2E , 0 x2F , 0 x30 , 0 x31 , 0 x32 , 0 x33 , 0 x34 , 0 x35 , 0 x36 , 0 x37 , 0 x38 , 0 x39 , 0 x3A , 0 x3B , 0 x3C , 0 x3D , 0 x3E , 0 x3F , 0 x40 , 0 x41 , 0 x42 , 0 x43 , 0 x44 , 0 x45 , 0 x46 , 0 x47 , 0 x48 , 0 x49 , 0 x4A , 0 x4B , 0 x4C , 0 x4D , 0 x4E , 0 x4F , 0 x50 , 0 x51 , 0 x52 , 0 x53 , 0 x54 , 0 x55 , 0 x56 , 0 x57 , 0 x58 , 0 x59 , 0 x5A , 0 x5B , 0 x5C , 0 x5D , 0 x5E , 0 x5F , 0 x60 , 0 x61 , 0 x62 , 0 x63 , 0 x64 , 0 x65 , 0 x66 , 0 x67 , 0 x68 , 0 x69 , 0 x6A , 0 x6B , 0 x6C , 0 x6D , 0 x6E , 0 x6F , 0 x70 , 0 x71 , 0 x72 , 0 x73 , 0 x74 , 0 x75 , 0 x76 , 0 x77 , 0 x78 , 0 x79 , 0 x7A , 0 x7B , 0 x7C , 0 x7D , 0 x7E , ] & { [ i: number ] : 0x7F ; } ; export type IncrementMap = [ 0 x01 , 0 x02 , 0 x03 , 0 x04 , 0 x05 , 0 x06 , 0 x07 , 0 x08 , 0 x09 , 0 x0A , 0 x0B , 0 x0C , 0 x0D , 0 x0E , 0 x0F , 0 x10 , 0 x11 , 0 x12 , 0 x13 , 0 x14 , 0 x15 , 0 x16 , 0 x17 , 0 x18 , 0 x19 , 0 x1A , 0 x1B , 0 x1C , 0 x1D , 0 x1E , 0 x1F , 0 x20 , 0 x21 , 0 x22 , 0 x23 , 0 x24 , 0 x25 , 0 x26 , 0 x27 , 0 x28 , 0 x29 , 0 x2A , 0 x2B , 0 x2C , 0 x2D , 0 x2E , 0 x2F , 0 x30 , 0 x31 , 0 x32 , 0 x33 , 0 x34 , 0 x35 , 0 x36 , 0 x37 , 0 x38 , 0 x39 , 0 x3A , 0 x3B , 0 x3C , 0 x3D , 0 x3E , 0 x3F , 0 x40 , 0 x41 , 0 x42 , 0 x43 , 0 x44 , 0 x45 , 0 x46 , 0 x47 , 0 x48 , 0 x49 , 0 x4A , 0 x4B , 0 x4C , 0 x4D , 0 x4E , 0 x4F , 0 x50 , 0 x51 , 0 x52 , 0 x53 , 0 x54 , 0 x55 , 0 x56 , 0 x57 , 0 x58 , 0 x59 , 0 x5A , 0 x5B , 0 x5C , 0 x5D , 0 x5E , 0 x5F , 0 x60 , 0 x61 , 0 x62 , 0 x63 , 0 x64 , 0 x65 , 0 x66 , 0 x67 , 0 x68 , 0 x69 , 0 x6A , 0 x6B , 0 x6C , 0 x6D , 0 x6E , 0 x6F , 0 x70 , 0 x71 , 0 x72 , 0 x73 , 0 x74 , 0 x75 , 0 x76 , 0 x77 , 0 x78 , 0 x79 , 0 x7A , 0 x7B , 0 x7C , 0 x7D , 0 x7E , 0 x7F , 0 x00 , ] & { [ i: number ] : 0x00 ; } ; ããŒãæ§é äœ BF ã§ã¯ãã¡ã¢ãªãçšæããŠãã€ã³ã¿æäœã»ãã€ã³ã¿ãä»ããæäœãåæã«ãªã£ãŠããŸãã ãã¡ããåã¬ãã«ããã°ã©ãã³ã°ã§å¯äœçšã¯èšè¿°ãã«ããããããã€ã³ã¿åæãšãªã£ãŠããéšåãåèããåã衚çŸåã®å¥ã®åœ¢ã«çœ®ãæããå¿
èŠããããŸãã ã¡ã¢ãªãããã°ã©ã ãåãããŒãæ§é ã§æããŸããä»çç®ããŠããå€ããã®å·Šå³ã«åãç¶ããŠããæ§åãèããã®ãäžèšã®ãããªæ§é ã«ãªããŸãã ããŒãæ§é äœã®å®è£
ãã®ãããªæ§é äœã¯ãHaskell ã§ã® data 宣èšãšåããããªåœ¢ã§ãTypeScript ã®åã§ã¯ãªããžã§ã¯ãåã«ãã宣èšãã§ããŸãã data Tape a = Tape { prevs :: [a] , curr :: a , nexts :: [a] } extends unknown[] ã«ãã£ãŠåãªãé
ååã§ã¯ãªããåèŠçŽ ãç¬ç«ãã åã¬ãã«é
åãšããŠã®ã¿ãã« ãå©çšã§ããŸãã export type Tape < Hs extends unknown [], C , Ts extends unknown []> = { h : Hs c : C t : Ts } ããã§ããã€ãã®åºæ¬çãªæäœãå®çŸ©ããŠããŸããŸãããã çŸåšã®å€ã«å¯Ÿããæäœ ã€ã³ã¯ãªã¡ã³ãã»ãã¯ãªã¡ã³ã èªã¿åºããæžã蟌㿠ããŒãäžã®ç§»å çç®ããããããå·Šå³ã«ç§»åããæäœ 察å¿ãã [ , ] ãžã®ãžã£ã³ãã¯ç¹°ãè¿ãã«ãã£ãŠå®çŸãã åºæ¬æäœã®å®è£
Tape a ããæ°ãã Tape a ãäœã ( Tape a -> Tape a ) ãšãã圢ã®å®è£
ãšãªããŸãã -- | 次ã®èŠçŽ ã«ç§»å next :: Tape a -> Tape a next (Tape prevs curr (n : nexts)) = Tape (curr : prevs) n nexts -- | åã®èŠçŽ ã«ç§»å prev :: Tape a -> Tape a prev (Tape (p : prevs) curr nexts) = Tape prevs p (curr : nexts) -- | çŸåšã®èŠçŽ ãã€ã³ã¯ãªã¡ã³ã incr :: Enum a => Tape a -> Tape a incr (Tape prevs curr nexts) = Tape prevs (succ curr) nexts -- | çŸåšã®èŠçŽ ããã¯ãªã¡ã³ã decr :: Enum a => Tape a -> Tape a decr (Tape prevs curr nexts) = Tape prevs (pred curr) nexts -- | çŸåšã®èŠçŽ ãååŸ get :: Tape a -> a get (Tape _ curr _) = curr -- | çŸåšã®èŠçŽ ãèšå® put :: a -> Tape a -> Tape a put a (Tape prevs _ nexts) = Tape prevs a nexts TypeScript ã®åã§ãåæ§ã«ã Tape ãåãåã£ãŠæ°ãã Tape ãäœæãããšããæ¹éã§å®è£
ã§ããŸãã [infer H, ...infer Hs] ã®ãã¿ãŒã³ãããã³ã°ã«ãããåã¬ãã«é
åã®èŠçŽ (head, rest) ãæ±ãããšãã§ããŠããŸããŸãã export type Prev < M > = M extends Tape < [infer H , ... infer Hs] , infer C , infer Ts > ? Tape< Hs , H , [C , ... Ts] > : never export type Next < M > = M extends Tape < infer Hs , infer C , [infer T , ... infer Ts] > ? Tape< [C , ... Hs] , T , Ts > : never export type Incr < M > = M extends Tape < infer Hs , infer C extends number , infer Ts > ? Tape< Hs , IncrementMap [C], Ts > : never export type Decr < M > = M extends Tape < infer Hs , infer C extends number , infer Ts > ? Tape< Hs , DecrementMap [C], Ts > : never export type PutC < M , C > = M extends Tape < infer Hs , unknown , infer Ts > ? Tape < Hs , C , Ts > : never ããã°ã©ã å®è¡ åºæ¬çãªæ§é ãæäœã¯å®çŸ©ããŠããŸã£ãã®ã§ã次ã¯ã€ã³ã¿ããªã¿ãšããŠéèŠãªå®è¡ã«ã€ããŠèããŸãã è©äŸ¡åšãšããŠã®å®è¡ç³»å
éš (ã¡ã¢ãªã»ããã°ã©ã ãã€ã³ã¿) ãšå€çãšã®ãããšããå«ã广ã®ç®¡çã®éšåããæ¬¡ã®ãããªåœ¢ã§åãåããŸãã åã¬ãã«ããã°ã©ãã³ã°ã§ã¯å
¥åºåããã®ãŸãŸæ±ãããšã¯ã§ããªãã®ã§ãå
¥ååŸ
ã¡ãåºåããããšããããšã¯ç¹å¥ãªç¶æ
ãšããŠè¡šçŸããããšã«ããŸãã è©äŸ¡åšã®å
éšç¶æ
ãã¡ãã¯è³ã£ãŠã·ã³ãã«ã§ãã ç¶æ
ã¯ã¡ã¢ãªãããã°ã©ã ã®ããŒã (çŸåšäœçœ®ãä¿æãã) ããæã ãããè©äŸ¡ã«éãããšã«ãã£ãŠã次ã®å®è¡ã«é¢ããç¶æ
ãåºãŠãã data Machine = Machine { memory :: DT.Tape Int , program :: DT.Tape Char } type Runner < M , P > = { mem : M prg : P } å€éšãšã®ãããšããå«ãã¢ã¯ã·ã§ã³ ä»ã®ã¡ã¢ãªã»ããã°ã©ã ãå«ããå
çšã®æ§é ãè©äŸ¡ããŠåŸãããã¢ã¯ã·ã§ã³ã§ãã -- | äœãããªããå
¥åèŠæ±ãåºåèŠæ±ãçµäºã® 4 ã€ã®ã¢ã¯ã·ã§ã³ãæã€ data WithAction a = ActionN { hold :: a } -- ^ å€éšã«ã¯äœãããªã | ActionI { hold :: a } -- ^ å
¥åèŠæ± | ActionO { hold :: a, out :: Int } -- ^ åºåèŠæ± | ActionE -- ^ çµäº ãããåã¬ãã«ããã°ã©ãã³ã°ã§åçŸãããšãADT ããã¯åå¥ã®åãšããŠå®çŸ©ããŠãããŠãåŸã§ extends ãªã©ã®æ¡ä»¶åå²ããŠãããæ¹ãçŽ çŽã«ãªããŸãã type ActionN < R > = { action : "N" ; runner : R } type ActionI < R > = { action : "I" ; runner : R } type ActionO < R , O > = { action : "O" ; runner : R ; output : O } type ActionE = { action : "E" } 8 ã€ã®åœä»€ã«å¯Ÿããæäœã®æŽç è©äŸ¡åšã®ç¶æ
ãšã¢ã¯ã·ã§ã³ãåãšããŠå®çŸ©ã§ããã®ã§ã次ã¯ããã°ã©ã ã®ç€ºãåœä»€ãåŠçããŠããå®è£
ãèããŠãããŸãã ããã¯æåã«ç¢ºèªãã BF ã® 8 ã€ã®åœä»€ã«å¯ŸããŠã次ã®è©äŸ¡åšã®ç¶æ
ãšèšç®ã®å¹æãå«ãå
šäœãè¿ã圢ã§å®çŸ©ããŠããã°è¯ãã§ãã ã€ã³ã¯ãªã¡ã³ã ãã¯ãªã¡ã³ã 次ãåç
§ (ãã€ã³ã¿ã€ã³ã¯ãªã¡ã³ã) åãåç
§ (ãã€ã³ã¿ãã¯ãªã¡ã³ã) while (ãžã£ã³ã) while end (ãžã£ã³ãããã¯) getchar putchar åœä»€â次ã®ç¶æ
ã»ã¢ã¯ã·ã§ã³ ããŠãå³ã§æŽçã§ããã®ã§ãå®è£
ã«ãã®ãŸãŸèœãšããŠãããŸãã çŸåšã®åœä»€ãã€ã³ã¿ãæãåœä»€ã«å¿ããŠã次㮠Action ãšç¶æ
ãè¿ããŸãã -- | 次ã®ã¹ããããå®è¡ããç¶æ
ãšã¢ã¯ã·ã§ã³ãè¿ã step :: Machine -> WithAction Machine step machine = case pc of '+' -> ActionN $ machine { memory = DT.incr (memory machine), program = DT.next (program machine) } '-' -> ActionN $ machine { memory = DT.decr (memory machine), program = DT.next (program machine) } '>' -> ActionN $ machine { memory = DT.next (memory machine), program = DT.next (program machine) } '<' -> ActionN $ machine { memory = DT.prev (memory machine), program = DT.next (program machine) } '[' -> ActionN $ machine { program = if mc == 0 then skip (program machine) else DT.next (program machine) } ']' -> ActionN $ machine { program = if mc /= 0 then back (program machine) else DT.next (program machine) } ',' -> ActionI { hold = machine { program = DT.next (program machine) } } '.' -> ActionO { hold = machine { program = DT.next (program machine) }, out = DT.get (memory machine) } _ -> ActionE where (pc, mc) = (,) <$> DT.get . program <*> DT.get . memory $ machine TypeScript ã§æžããŠããã»ãšãã©åã察å¿ããããŸãã type Step < R > = R extends Runner < infer M extends TapeMm , infer P extends TapePg > ? P[ 'c' ] extends '+' ? ActionN< Runner < Incr < M >, Next < P >>> : P[ 'c' ] extends '-' ? ActionN< Runner < Decr < M >, Next < P >>> : P[ 'c' ] extends '>' ? ActionN< Runner < Next < M >, Next < P >>> : P[ 'c' ] extends '<' ? ActionN< Runner < Prev < M >, Next < P >>> : P[ 'c' ] extends '[' ? ActionN< Runner < M , M [ 'c' ] extends 0 ? Skip < P > : Next < P >>> : P[ 'c' ] extends ']' ? ActionN< Runner < M , M [ 'c' ] extends 0 ? Next < P > : Back < P >>> : P[ 'c' ] extends ',' ? ActionI< Runner < M , Next < P >>> : P[ 'c' ] extends '.' ? ActionO< Runner < M , Next < P >>, M [ 'c' ]> : ActionE : never; ç¶æ
ã»ã¢ã¯ã·ã§ã³âç¶ç¶ 次ã¯ç¶æ
ãã¢ã¯ã·ã§ã³ãåããŠã次ã®ã¹ãããã«ç¶ç¶ããŠããã«ãŒããå®è£
ããŠãããŸãã äžèšã® step ãå®è¡ãããã® Action ã«å¿ããæäœãå®è¡ããŠãããŸãã -- | å
¥åãæ¶è²»ã»åºåãåéããªãã step ãç¹°ãè¿ã loop :: (Machine -> WithAction Machine) -> (String, Machine) -> String loop step (input, machine) = go (step machine) where -- ã¢ã¯ã·ã§ã³ã«å¯Ÿå¿ããåäœãå®è¡ããååž°ã«é²ã go (ActionN machine') = loop step (input, machine') -- ãã®ãŸãŸæ¬¡ãž go (ActionI machine') = loop step (iTail, machine'') where -- å
¥åãæ¶è²»ããŠã¡ã¢ãªã«æžã蟌ã¿ã次ã«é²ã (iHead : iTail) = input machine'' = machine' { memory = DT.put (fromEnum iHead) (memory machine') } go (ActionO machine' out) = toEnum out : loop step (input, machine') -- åºåãåéããæ¬¡ã«é²ã go ActionE = [] -- çµç«¯ TypeScript ã®åã®æ¹ã§ã¯ãä»åã¯æååã®çޝç©ãä¿æãã圢ã§å®è£
ããŠããŸããã¡ãã£ãšåœåãç°ãªã£ãŠããŸã£ãŠããŸããããã£ãŠããããšã¯åãã§ãã type Exec < R , I extends string , O extends string = '' > = Step < R > extends infer WithAction ? WithAction extends ActionN< infer Q > ? Exec< Q , I , O > : WithAction extends ActionI< infer Q > ? I extends ` ${ infer F }${ infer S } ` ? Exec< Read < Q , CharToNumMap [F]>, S , O > : Exec< Read < Q , 0>, I , O > : WithAction extends ActionO< infer Q , infer N extends number > ? Exec< Q , I , ` ${ O }${ NumToCharMap [N] } ` > : WithAction extends ActionE ? O : never : never; ãŸãšã TypeScript ã§ Brainf**k åŠçç³»ã®åã¬ãã«ããã°ã©ã ã®å®è£
ã«ã€ããŠèŠãŠãããŸããã è£è¶³ãšããŠãTypeScript ã®åã¬ãã«ããã°ã©ãã³ã°å®è¡ç³»ã«ã¯æ¬¡ã®ãããªå¶çŽããããŸãã åã®ååž°è©äŸ¡åæ°ãã€ãŸãå®è¡ã§ããã¹ãããæ°ãå¶éãããŠãã Tape æ§é äœã®ä¿æããèŠçŽ åã®é·ãã«å¶éããã (ã©ã¡ããå€§äœ 1,000 çšåºŠã®ã€ã¡ãŒãž) äžæ¹ããã®ãããªå¶éãããäžã§ããåé ã«ç€ºããäŸã®ããã«ç°¡å㪠Hello World ã®äŸãŸã§ã¯å®è£
ã§ããŠããŸããŸãã ã¿ãªããããã²èªåã®åã¬ãã«ããã°ã©ãã³ã°ã«ææŠããŠã¿ãŠãã ããã ç§ãä»å瀺ããå®è£
ãæåã§ã¯ãªããšæããŸããããã£ãšè¯ããã®ãæžããŠã¿ããããªã©ã楜ããã§ã¿ãŠãã ããã ä»é² Haskell ã®ã³ãŒãå
šæãæ²èŒããŠãããŸãã cwd-k2/bf-in-type ã®ãªããžããª ãšæ¯èŒããããŸãã¯æå
ã§ãã¹ãå®è¡ãããªã©ããŠãã ããã ãã£ã¬ã¯ããªæ§æ . âââ Data â  âââ Tape.hs âââ Interpreter.hs âââ Main.hs Data/Tape.hs module Data.Tape ( Tape( .. ), zeros, fromList, next, prev, incr, decr, get, put, ) where -- | ããŒãæ§æ§é äœ -- * ååŸã«ç¡éã«èŠçŽ ããããçŸåšèŠçŽ (éã®å
ã«ãããã®) ãäžå¿ã«é
眮ããŠãã -- -- > <-prev- ... 4 5 6 <<7>> 8 9 10 ... -next-> data Tape a = Tape { prevs :: [a] , curr :: a , nexts :: [a] } deriving Show -- | ãŒãåæåãããç¡éé·ã®ããŒã zeros :: Enum a => Tape a zeros = Tape (repeat $ toEnum 0 ) (toEnum 0 ) (repeat $ toEnum 0 ) -- | ãªã¹ãããããŒããäœæ fromList :: [a] -> Tape a fromList (x : xs) = Tape [] x xs fromList [] = undefined -- ä»åã¯ç¹ã«èããã«æªå®çŸ©ãšãã -- | 次ã®èŠçŽ ã«ç§»å next :: Tape a -> Tape a next (Tape prevs curr (n : nexts)) = Tape (curr : prevs) n nexts -- | åã®èŠçŽ ã«ç§»å prev :: Tape a -> Tape a prev (Tape (p : prevs) curr nexts) = Tape prevs p (curr : nexts) -- | çŸåšã®èŠçŽ ãã€ã³ã¯ãªã¡ã³ã incr :: Enum a => Tape a -> Tape a incr (Tape prevs curr nexts) = Tape prevs (succ curr) nexts -- | çŸåšã®èŠçŽ ããã¯ãªã¡ã³ã decr :: Enum a => Tape a -> Tape a decr (Tape prevs curr nexts) = Tape prevs (pred curr) nexts -- | çŸåšã®èŠçŽ ãååŸ get :: Tape a -> a get (Tape _ curr _) = curr -- | çŸåšã®èŠçŽ ãèšå® put :: a -> Tape a -> Tape a put a (Tape prevs _ nexts) = Tape prevs a nexts Interpreter.hs module Interpreter ( bf ) where import qualified Data.Tape as DT import Data.List (unfoldr) -- | ã¡ã¢ãªãšããã°ã©ã ãæã€ data Machine = Machine { memory :: DT.Tape Int , program :: DT.Tape Char } deriving Show -- | äœãããªããå
¥åèŠæ±ãåºåèŠæ±ãçµäºã® 4 ã€ã®ã¢ã¯ã·ã§ã³ãæã€ data WithAction a = ActionN { hold :: a } -- ^ å€éšã«ã¯äœãããªã | ActionI { hold :: a } -- ^ å
¥åèŠæ± | ActionO { hold :: a, out :: Int } -- ^ åºåèŠæ± | ActionE -- ^ çµäº deriving Show -- | 察å¿ãã @']'@ ãŸã§ããã°ã©ã ãã¹ããããã skip :: DT.Tape Char -> DT.Tape Char skip = skipInner 0 where skipInner n program = let program' = DT.next program in case DT.get program' of '[' -> skipInner (n + 1 ) program' ']' -> if n == 0 then program' else skipInner (n - 1 ) program' _ -> skipInner n program' -- | 察å¿ãã @'['@ ãŸã§ããã°ã©ã ãæ»ã back :: DT.Tape Char -> DT.Tape Char back = backInner 0 where backInner n program = let program' = DT.prev program in case DT.get program' of ']' -> backInner (n + 1 ) program' '[' -> if n == 0 then program' else backInner (n - 1 ) program' _ -> backInner n program' -- | 次ã®ã¹ããããå®è¡ããç¶æ
ãšã¢ã¯ã·ã§ã³ãè¿ã step :: Machine -> WithAction Machine step machine = case pc of '+' -> ActionN $ machine { memory = DT.incr (memory machine), program = DT.next (program machine) } '-' -> ActionN $ machine { memory = DT.decr (memory machine), program = DT.next (program machine) } '>' -> ActionN $ machine { memory = DT.next (memory machine), program = DT.next (program machine) } '<' -> ActionN $ machine { memory = DT.prev (memory machine), program = DT.next (program machine) } '[' -> ActionN $ machine { program = if mc == 0 then skip (program machine) else DT.next (program machine) } ']' -> ActionN $ machine { program = if mc /= 0 then back (program machine) else DT.next (program machine) } ',' -> ActionI { hold = machine { program = DT.next (program machine) } } '.' -> ActionO { hold = machine { program = DT.next (program machine) }, out = DT.get (memory machine) } _ -> ActionE where (pc, mc) = (,) <$> DT.get . program <*> DT.get . memory $ machine -- | å
¥åãæ¶è²»ã»åºåãåéããªãã step ãç¹°ãè¿ã loop :: (Machine -> WithAction Machine) -> (String, Machine) -> String loop step (input, machine) = go (step machine) where -- ã¢ã¯ã·ã§ã³ã«å¯Ÿå¿ããåäœãå®è¡ããååž°ã«é²ã go (ActionN machine') = loop step (input, machine') -- ãã®ãŸãŸæ¬¡ãž go (ActionI machine') = loop step (iTail, machine'') where -- å
¥åãæ¶è²»ããŠã¡ã¢ãªã«æžã蟌ã¿ã次ã«é²ã (iHead : iTail) = input machine'' = machine' { memory = DT.put (fromEnum iHead) (memory machine') } go (ActionO machine' out) = toEnum out : loop step (input, machine') -- åºåãåéããæ¬¡ã«é²ã go ActionE = [] -- çµç«¯ -- | Bf ããã°ã©ã ãããå
¥åãåãåã£ãŠåºåãè¿ã颿°ãäœã bf :: String -> [Char] -> String bf program input = loop step (input', machine) where input' = input ++ repeat ' \0 ' machine = Machine { memory = DT.zeros , program = DT.next $ DT.fromList ( "#" ++ program ++ "#" ) } Main.hs module Main where import Interpreter -- | ãããŒã¯ãŒã«ããã Bf ããã°ã©ã helloWorld :: String helloWorld = "++++++++++[>+++++++>++++++++++>+++++++++++>+++>+++++++++>+<<<<<<-]>++.>+.>--..+++.>++.>---.<<.+++.------.<-.>>+.>>." -- | ãšã³ãŒãã Bf ããã°ã©ã echo :: String echo = "+[,.]" main :: IO () main = do let getOutputBf = bf helloWorld putStr $ getOutputBf "ããã«ã¡ã¯ \n "
åç»
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã








