![èŠåºãç»å](https://assets.st-note.com/production/uploads/images/85868782/rectangle_large_type_2_859630833b6c1db7be1352a680defc56.png?width=800)
ð代æ°çãªããŒã¿æ§é (ADT)ãšæœè±¡ããŒã¿å(ADT) AST
代æ°çããŒã¿åãšã¯ãåãšç©ãããªãããŒã¿åã§ãããåã¯éžæåŒãç©ã¯è¡šåœ¢åŒ
ã代æ°çããŒã¿æ§é ããšããçšèªã¯ããã®æ§é ãæ°åŠã®ä»£æ°åŠãç¹ã«éåè«ãšé¢é£ããŠããããšããæ¥ãŠããŸããããã§ã®ã代æ°çããšããèšèã¯ããããã®ããŒã¿æ§é ããéåéã®é¢ä¿ãæäœãè¡šçŸãã代æ°åŠã®åçã«åŸã£ãŠããããšãæããŸãã
1. **ç©ã®åïŒProduct TypesïŒ**:
- ç©ã®åã¯æ°åŠã®çŽç©ïŒCartesian ProductïŒã«äŒŒãŠããŸããçŽç©ã¯ãè€æ°ã®éåã®èŠçŽ ã®çµã¿åãããè¡šããŸããåæ§ã«ãç©ã®åã¯è€æ°ã®å€ãäžã€ã®æ§é ã«çµã¿åãããããšã§ãããããã®å€ãç°ãªãåãæã€ããšãã§ããŸãã
2. **åã®åïŒSum TypesïŒ**:
- åã®åã¯æ°åŠã®åéåïŒUnionïŒã«é¡äŒŒããŠããŸããåéåã¯è€æ°ã®éåã®èŠçŽ ããã¹ãŠå«ãéåã§ããåã®åã§ã¯ãè€æ°ã®ç°ãªãåã®ããããäžã€ã®å€ãæã€ããšãã§ããããã«ããç°ãªãå¯èœæ§ã®ããåã®çµã¿åãããè¡šçŸããŠããŸãã
ãã®ããã«ã代æ°çããŒã¿æ§é ã¯ãããããã®æ§é ãæ°åŠçãªæŠå¿µãšå¯æ¥ã«é¢é£ããŠãããããã代æ°çããšåŒã°ããŸããããã°ã©ãã³ã°ã«ãããŠããããã®æŠå¿µãçšããããšã§ãããæ確ã§å®å šãªã³ãŒãã®æ§ç¯ãå¯èœã«ãªããŸãã
代æ°çããŒã¿åã®äžè¬çãªã¯ã©ã¹ã¯ãç©åïŒããªãã¡ã¿ãã«ããã³ã¬ã³ãŒãïŒãšååïŒããªãã¡ã¿ã°ä»ããŸãã¯äžé£ç¶ã®å ±çšäœãå ±ç©åãŸãã¯å€éåïŒã®2ã€ã§ãã
çŽç©ã»æ§é äœã»ã¿ãã«ã»ã¬ã³ãŒãã»ããŒãã«
ç©åã®ãã¹ãŠã®å¯èœãªå€ã®éåã¯ããã®ãã£ãŒã«ãåã®ãã¹ãŠã®å¯èœãªå€ã®éåã®éåè«çç©ãããªãã¡ãã«ã«ãç©ã§ããã
çŽåãå ±çšäœãUNIONãããªã¢ã³ããåæ
ååã®å€ã¯éåžžïŒããªã¢ã³ããšåŒã°ããããã€ãã®ã¯ã©ã¹ã«ã°ã«ãŒãåãããïŒããªã¢ã³ãåã®å€ã¯éåžžãã³ã³ã¹ãã©ã¯ã¿ãšåŒã°ããæºæ©èœçãªå®äœã§äœæããã
ã³ã³ãã¥ãŒã¿ãµã€ãšã³ã¹ã§ã¯ãã¿ã°ä»ãçµåã¯ãããªã¢ã³ããããªã¢ã³ãã¬ã³ãŒããéžæåãå€å¥åçµåãéæ¥ååçµåãåèšåãã³ãããã¯ããšãåŒã°ããè€æ°ã®ç°ãªããåºå®ããåãåãããå€ãä¿æããããã«äœ¿ãããããŒã¿æ§é ã§ãããäžåºŠã«äœ¿çšã§ããåã¯1ã€ã ãã§ãããã¿ã°ãã£ãŒã«ãã¯ã©ãã䜿çšãããŠããããæ瀺çã«ç€ºãã
ã¿ã°ä»ãçµåã¯ãæãåçŽãªèªå·±èšè¿°åããŒã¿åœ¢åŒãšèŠãªãããšãã§ããŸããã¿ã°ä»ãçµåã®ã¿ã°ã¯ãæãåçŽãªçš®é¡ã®ã¡ã¿ããŒã¿ãšèŠãªãããšãã§ããŸãã
åã®åã®ãã¹ãŠã®å¯èœãªå€ã®éåã¯ããã®ããªã¢ã³ãã®ãã¹ãŠã®å¯èœãªå€ã®éåã®éåè«çãªåãããªãã¡é¢æ¥çµåïŒthe disjoint unionïŒã§ãã
Tagged unionïŒãŸãã¯discriminated union, variant, sum type, algebraic data typeãªã©ãšãåŒã°ããïŒã¯ãè€æ°ã®ç°ãªãåã®ããããäžã€ã®å€ãåãããšãã§ããããŒã¿æ§é ã§ããåå€ã¯ã¿ã°ïŒãŸãã¯ãã£ã¹ã¯ãªããã³ãïŒãšããŠç¥ãããç¹å®ã®åãšé¢é£ä»ããããŠããããã®ã¿ã°ã䜿çšããŠunionã®çŸåšã®åãèå¥ããããšãã§ããŸãã
以äžã¯ãTypeScriptã§ã®tagged unionã®äŸã§ãïŒ
type Shape =
{ kind: "circle"; radius: number }
| { kind: "square"; sideLength: number }
| { kind: "rectangle"; width: number; height: number };
function area(s: Shape): number {
switch (s.kind) {
case "circle":
return Math.PI * s.radius * s.radius;
case "square":
return s.sideLength * s.sideLength;
case "rectangle":
return s.width * s.height;
}
}
äžèšã®äŸã§ã¯ã`Shape`åã¯3ã€ã®ç°ãªã圢ç¶ãæã€ããšãã§ããããããã®åœ¢ç¶ã¯`kind`ãšããã¿ã°ãæã£ãŠããŸãã`area`é¢æ°ã¯ããã®ã¿ã°ã䜿çšããŠã©ã®åœ¢ç¶ã®é¢ç©ãèšç®ããããå€æããŸãã
Tagged unionã¯ãç¹å®ã®å€ãéãããããã€ãã®ç°ãªãåã®ãã¡ã®1ã€ã§ããããšãè¡šçŸãããšãã«éåžžã«äŸ¿å©ã§ããå€ãã®é¢æ°åããã°ã©ãã³ã°èšèªãæ°ããèšèªïŒäŸ: Rust, TypeScript, Haskellãªã©ïŒã§ã¯ããã®æŠå¿µã¯éåžžã«äžè¬çã§ãã
亀ãããæããªãå (disjoint union): ãã®æã«å±ããéšåéåã®ã©ã®äºã€ãäºãã«çŽ (pairwise disjoint) ã§ãããšãã®ãéåžžã®å䜵ã
代æ°çããŒã¿åã¯ã1970幎代ã«ãšãžã³ãã©å€§åŠã§éçºãããå°åã®é¢æ°åããã°ã©ãã³ã°èšèªHopeã«å°å ¥ããã
Hopeèšèª
Hopeã¯1970幎代ã«ãšãžã³ãã©å€§åŠã§éçºãããå°åã®é¢æ°åããã°ã©ãã³ã°èšèªã§ãã[1][2]ã MirandaãHaskellãããå€ããåããå倧åŠã§éçºãããMLãšåææã§ãããHopeã¯Rod BurstallãšJohn Darlingtonãããã°ã©ã å€æã®ç 究ã§éçºããåçŽãªé¢æ°åèšèªNPL[3]ãã掟çãã[4]ã NPLãšHopeã¯ã³ãŒã«ãã€ãã¿ãŒã³è©äŸ¡ãšä»£æ°çããŒã¿åãæåã«åããèšèªãšããŠæ³šç®ãããŠãã
Hopeèšèªã§éä¹ããã°ã©ã
![](https://assets.st-note.com/img/1661912541978-N3nZHZgNZr.png?width=800)
çæ¹åãªã¹ãïŒååïŒ
代æ°çããŒã¿åã®æãäžè¬çãªäŸãšããŠãåäžé£çµãªã¹ã(çæ¹åãªã¹ã
)ãããããªã¹ãåã¯åã®åã§ïŒç©ºã®ãªã¹ããè¡šãNilãšïŒæ°ããèŠçŽ xãšãªã¹ãxsãçµã¿åãããŠæ°ãããªã¹ããäœãCons x xsãšãã2ã€ã®ããªãšãŒã·ã§ã³ããã
ããããã®ããŒã¿åã«ã¯ãã³ã³ã¹ãã©ã¯ã¿ãšåŒã°ããèå¥åãé¢é£ä»ããããŠãããããã¯ããŒã¿ã®çš®é¡ãè¡šãã¿ã°ã®ãããªãã®ãšèŠãªãããšãã§ããŸãã
圢åŒçã«ã¯ãæœè±¡ããŒã¿åã¯ãè«ççãªæ¯ãèããå€ã®éåãšæäœã®éåã«ãã£ãŠå®çŸ©ããããªããžã§ã¯ãã®ã¯ã©ã¹ã[1]ãšå®çŸ©ã§ãããããã¯ãæ°åŠã«ããã代æ°çæ§é ã«é¡äŒŒããŠãããåäœãã®æå³ã¯èè ã«ãã£ãŠç°ãªããåäœã®åœ¢åŒçä»æ§ã®äž»ãªãã®ã¯å ¬ççïŒä»£æ°çïŒä»æ§ãšæœè±¡ã¢ãã«ã®2çš®é¡ã§ããããããã¯ããããæœè±¡æ©æ¢°ã®å ¬ççæå³è«ãšæŒç®çæå³è«ã«çžåœãã[2]ããŸããèšç®è€é床ïŒãã³ã¹ããïŒããæéïŒèšç®æäœïŒãšç©ºéïŒå€ã®è¡šçŸïŒã®äž¡åŽé¢ããèšè¿°ããèè ããããå®éã«ã¯ãæœè±¡åãå®å šã§ã¯ãªããããå€ãã®äžè¬çãªããŒã¿åã¯ADTã§ã¯ãªãããŠãŒã¶ã¯è¡šçŸã«èµ·å ããç®è¡ãªãŒããŒãããŒãªã©ã®åé¡ã«æ³šæããªããã°ãªããªããäŸãã°ãæŽæ°ã¯åºå®å¹ ã®å€ïŒ32ããããŸãã¯64ãããã®2é²æ°ïŒãšããŠæ ŒçŽãããããšãå€ããããæ倧å€ãè¶ ãããšæŽæ°ã®ãªãŒããŒãããŒãçºçããã
äŸãã°ïŒæŽæ°ã¯æœè±¡ããŒã¿åã§ããïŒå€ ..., -2, -1, 0, 1, 2, ... ãšïŒå ç®ïŒæžç®ïŒä¹ç®ïŒé€ç®ïŒããã³å€§ãªãå°ãªããªã©ã®æŒç®ã«ãã£ãŠå®çŸ©ããïŒã³ã³ãã¥ãŒã¿ãæŽæ°ãã©ãè¡šçŸããããšã¯é¢ä¿ãªãïŒïŒæŽæ°åå²ã«æ³šæããŠïŒèº«è¿ãªæ°åŠã«åŸã£ãŠæ¯ãèãããããšãã§ããŸãã
![](https://assets.st-note.com/img/1661929237235-ZM22WjfdST.png?width=800)
ãé¡ãèŽããŸã