äŸååããæŒžé²çåä»ããŸã§ãåã·ã¹ãã ã®ææ°ã®é²æ©ãæ¢æ±ããäžçäžã®ãœãããŠã§ã¢éçºã®å®è·µãžã®åœ±é¿ãçè§£ããŸãã
é«åºŠãªåç ç©¶ïŒæå 端ã®åã·ã¹ãã æ©èœ
ãœãããŠã§ã¢éçºã®çµ¶ãéãªãé²åããç¶æ³ã«ãããŠãåã·ã¹ãã ã¯ãŸããŸãéèŠãªåœ¹å²ãæãããŠããŸããåçŽãªããŒã¿ã®æ€èšŒãè¶ ããŠãã³ãŒãã®æ£ç¢ºæ§ãä¿èšŒããé«åºŠãªéçè§£æãå¯èœã«ããããå®å šã§ä¿å®ããããã³ãŒãããŒã¹ãä¿é²ããããã®åŒ·åãªã¡ã«ããºã ãæäŸããŸãããã®èšäºã§ã¯ãåã·ã¹ãã ç ç©¶ã«ãããããã€ãã®æå ç«¯ã®æ©èœãšãäžçäžã®éçºè ã«ãšã£ãŠã®å®çšçãªæå³ãæ¢ããŸãã
é«åºŠãªåã·ã¹ãã ã®éèŠæ§ã®é«ãŸã
åŸæ¥ã®åã·ã¹ãã ã¯ãäž»ã«ã³ã³ãã€ã«æã«å€æ°ãšé¢æ°åŒæ°ã®åãæ€èšŒããããšã«çŠç¹ãåœãŠãŠããŸããããã¯åºæ¬çãªã¬ãã«ã®å®å šæ§ãæäŸããŸãããè€éãªããã°ã©ã ã®äžå€æ¡ä»¶ãæããããããŒã¿éã®é¢ä¿ã«ã€ããŠæšè«ãããããã«ã¯ãå€ãã®å Žåäžååã§ããé«åºŠãªåã·ã¹ãã ã¯ãããè±å¯ãªåæ§é ããã匷åãªåæšè«ã¢ã«ãŽãªãºã ãããã³äŸååã®ãµããŒããå°å ¥ããããšã«ããããã®æ©èœãæ¡åŒµããŸãããããã®æ©èœã«ãããéçºè ã¯ããè€éãªããã°ã©ã ã®ããããã£ã衚çŸããéçºã©ã€ããµã€ã¯ã«ã®æ©ã段éã§æœåšçãªãšã©ãŒãææã§ããããããããã°æéãççž®ãããœãããŠã§ã¢ã®ä¿¡é Œæ§ãåäžãããããšãã§ããŸãã
颿°åããã°ã©ãã³ã°ãã©ãã€ã ã®å°é ãšãææ°ã®ãœãããŠã§ã¢ã·ã¹ãã ã®è€éãã®å¢å€§ã¯ãé«åºŠãªåã·ã¹ãã ã«å¯ŸããéèŠãããã«ç œã£ãŠããŸããHaskellãScalaãRustãªã©ã®èšèªã¯ã匷åã§è¡šçŸåè±ããªåã·ã¹ãã ã®åãå®èšŒããŠããããã®åœ±é¿ã¯åŸã ã«äž»æµããã°ã©ãã³ã°ã«æµžéããŠããŸãã
äŸååïŒå€ã«äŸåããå
äŸååã¯ãé«åºŠãªåã·ã¹ãã ã®åºç€ã§ãã倿°ãä¿æããããŒã¿ã®çš®é¡ãèšè¿°ããåŸæ¥ã®åãšã¯ç°ãªããäŸååã¯åŒã®å€ã«äŸåã§ããŸããããã«ãããæ£ç¢ºãªå¶çŽãšäžå€æ¡ä»¶ãåã·ã¹ãã å ã«çŽæ¥ãšã³ã³ãŒãã§ããŸãã
äŸïŒãµã€ãºä»ããã¯ã¿ãŒ
ãã¯ã¿ãŒïŒãŸãã¯é åïŒããŒã¿æ§é ã«ã€ããŠèããŠã¿ãŸããããäžè¬çãªåã·ã¹ãã ã§ã¯ã倿°ããæŽæ°ã®ãã¯ã¿ãŒãã§ããããšã®ã¿ãæå®ããå ŽåããããŸãããã ããäŸååã䜿çšãããšããã¯ã¿ãŒã®æ£ç¢ºãªãµã€ãºããã®åå ã§æå®ã§ããŸãã
äŸååãåããæ¶ç©ºã®èšèªã§ã¯ã次ã®ããã«ãªããŸãã
Vector[5, Int] // 5ã€ã®æŽæ°ã®ãã¯ã¿ãŒ
Vector[n, String] // nåã®æååã®ãã¯ã¿ãŒïŒãnãã¯å€ïŒ
ããã§ãåã·ã¹ãã ã¯ããã¯ã¿ãŒã®å¢çå€ã®èŠçŽ ã«ã¢ã¯ã»ã¹ããªãããã«ãããªã©ãå¶çŽã匷å¶ã§ããŸããããã«ãããã©ã³ã¿ã€ã ãšã©ãŒã®äžè¬çãªåå ãè§£æ¶ãããŸãã
äŸååã®å©ç¹
- ã³ãŒãã®å®å šæ§ã®åäžïŒã³ã³ãã€ã«æã«ãé åã®å¢çå€ãšã©ãŒããŒãé€ç®ãããã³ãã®ä»ã®æœåšçãªåé¡ãææããŸãã
- ããã°ã©ã ã®æ£ç¢ºæ§ã®åäžïŒè€éãªããã°ã©ã ã®äžå€æ¡ä»¶ãåã·ã¹ãã ã«çŽæ¥ãšã³ã³ãŒãããããšã«ãããããã°ã©ã ã®åäœã«ã€ããŠæšè«ãããããªããŸãã
- ããã©ãŒãã³ã¹ã®åäžïŒã³ã³ãã€ã©ãŒã«ããæ£ç¢ºãªæ å ±ãæäŸããããšã«ãããäŸååã¯ããç©æ¥µçãªæé©åãå¯èœã«ããŸãã
äŸååããµããŒãããèšèª
äŸååã®åŒ·åãªãµããŒããåããèšèªã«ã¯ã次ã®ãããªãã®ããããŸãã
- AgdaïŒåŒ·åãªäŸååã·ã¹ãã ãåããçŽç²ãªé¢æ°åããã°ã©ãã³ã°èšèªã
- IdrisïŒå®çšçãªã¢ããªã±ãŒã·ã§ã³ã«çŠç¹ãåœãŠããäŸååãåããæ±çšããã°ã©ãã³ã°èšèªã
- ATSïŒãªãœãŒã¹ç®¡çã®ããã«äŸååãšç·åœ¢åãçµã¿åããã颿°åããã°ã©ãã³ã°èšèªã
- LeanïŒäŸååçè«ã䜿çšããããã°ã©ãã³ã°èšèªãšå®ç蚌æåšã®äž¡æ¹ã
å®å šã«äŸååã¯è€éã«ãªãå¯èœæ§ããããŸãããã³ãŒãã®å®å šæ§ãšæ£ç¢ºæ§ã®ç¹ã§å€§ããªå©ç¹ããããŸããäŸååã®æŠå¿µã®æ¡çšã¯ãä»ã®ããã°ã©ãã³ã°èšèªã®èšèšã«åœ±é¿ãäžããŠããŸãã
挞é²çåä»ãïŒåçåä»ããšéçåä»ãã®éã®ã®ã£ãããåãã
挞é²çåä»ãã¯ãéçºè ãåãããã°ã©ã å ã§éçã«åä»ããããã³ãŒããšåçã«åä»ããããã³ãŒããæ··åšãããããšãã§ããå®çšçãªã¢ãããŒãã§ããããã«ãããæ¢åã®ã³ãŒãããŒã¹ãéçåä»ãã«ç§»è¡ããããã®ã¹ã ãŒãºãªç§»è¡ãã¹ãæäŸãããéçºè ã¯ã³ãŒãã®éèŠãªã»ã¯ã·ã§ã³ã«éçåä»ããéžæçã«é©çšã§ããŸãã
ãAnyãå
挞é²çåä»ãã®éèŠãªæŠå¿µã¯ããanyãïŒãŸãã¯åæ§ã®ïŒåã®å°å ¥ã§ããã¿ã€ããanyãã®å€æ°ã¯ãä»ã®ä»»æã®ã¿ã€ãã®å€ãä¿æã§ããŸããåãã§ãã«ãŒã¯åºæ¬çã«ãanyããå«ãåãšã©ãŒãç¡èŠããåãã§ãã¯ãå®è¡æã«å»¶æããŸãã
äŸïŒTypeScriptïŒïŒ
let x: any = 5;
x = "hello"; // ã³ã³ãã€ã«æã®åãšã©ãŒãªã
console.log(x.toUpperCase()); // xãæååã§ãªãå Žåãã©ã³ã¿ã€ã ãšã©ãŒãçºçããå¯èœæ§ããããŸã
挞é²çåä»ãã®å©ç¹
- æè»æ§ïŒå®å šã«æžãæããå¿ èŠãªããæ¢åã®ã³ãŒãããŒã¹ã«éçåä»ããåŸã ã«å°å ¥ã§ããŸãã
- çžäºéçšæ§ïŒéçã«åä»ããããã³ãŒããšåçã«åä»ããããã³ãŒãéã®ã·ãŒã ã¬ã¹ãªå¯Ÿè©±ãå¯èœã«ããŸãã
- éçºæéã®ççž®ïŒéçºè ã¯ãè¿ éãªãããã¿ã€ãã³ã°ã«åçåä»ãã䜿çšããæ¬çªã³ãŒãã«éçåä»ãã«åãæ¿ããããšãã§ããŸãã
挞é²çåä»ãããµããŒãããèšèª
挞é²çåä»ãã®ãµããŒããåããäžè¬çãªèšèªã«ã¯ã次ã®ãããªãã®ããããŸãã
- TypeScriptïŒéçåä»ãã远å ããJavaScriptã®ã¹ãŒããŒã»ããã
- PythonïŒMyPyä»ãïŒïŒPythonã®ãªãã·ã§ã³ã®éçåãã§ãã«ãŒã§ããMyPyã¯ã挞é²çåä»ããå¯èœã«ããŸãã
- DartïŒãããããã©ãããã©ãŒã ã§ã®é«éã¢ããªåãã«æé©åãããGoogleã®ã¯ã©ã€ã¢ã³ãæé©åèšèªã
- HackïŒFacebookãPHPã®æ¹èšãšããŠäœæãããHHVMçšã®ããã°ã©ãã³ã°èšèªã
挞é²çåä»ãã¯ãå€§èŠæš¡ãªJavaScriptããã³Pythonãããžã§ã¯ãã®ä¿å®æ§ãšã¹ã±ãŒã©ããªãã£ãåäžãããããã®è²ŽéãªããŒã«ã§ããããšã蚌æãããŠããŸããéçåä»ãã®å©ç¹ãšåçåä»ãã®æè»æ§ã®ãã©ã³ã¹ãåããŸãã
亀差åãšå ±çšåïŒè€éãªåã®é¢ä¿ã衚çŸãã
亀差åãšå ±çšåã¯ãåéã®é¢ä¿ãå®çŸ©ããããã®ãã衚çŸåè±ããªæ¹æ³ãæäŸããŸããæ¢åã®åã®çµã¿åãããè¡šãæ°ããåãäœæã§ããŸãã
亀差åïŒANDïŒ
亀差åã¯ã亀差å ã®ãã¹ãŠã®åã«å±ããå€ã衚ããŸããããšãã°ã`Closable`ãš`Readable`ã®2ã€ã®ã€ã³ã¿ãŒãã§ãŒã¹ãããå Žåã亀差å`ClosableïŒReadable`ã¯ãéããããšãã§ããèªã¿åãå¯èœãªãªããžã§ã¯ãã衚ããŸãã
äŸïŒTypeScriptïŒïŒ
interface Closable {
close(): void;
}
interface Readable {
read(): string;
}
type ClosableReadable = Closable & Readable;
function process(obj: ClosableReadable) {
obj.read();
obj.close();
}
å ±çšåïŒORïŒ
å ±çšåã¯ãå ±çšäœã®å°ãªããšã1ã€ã®åã«å±ããå€ã衚ããŸããããšãã°ã`string | number`ã¯ãæååãŸãã¯æ°å€ã®ããããã«ãªãåŸãå€ã衚ããŸãã
äŸïŒTypeScriptïŒïŒ
function printValue(value: string | number) {
if (typeof value === "string") {
console.log(value.toUpperCase());
} else {
console.log(value * 2);
}
}
亀差åãšå ±çšåã®å©ç¹
- ã³ãŒãã®åå©çšæ§ã®åäžïŒããŸããŸãªåã§åäœã§ãããžã§ããªãã¯é¢æ°ãå®çŸ©ããŸãã
- åå®å šæ§ã®åäžïŒè€éãªåã®é¢ä¿ãããæ£ç¢ºã«ã¢ãã«åããã©ã³ã¿ã€ã ãšã©ãŒã®ãªã¹ã¯ã軜æžããŸãã
- ã³ãŒãã®è¡šçŸåã®åäžïŒæ¢åã®åãçµã¿åãããããšã§ãããç°¡æœã§èªã¿ãããã³ãŒããäœæããŸãã
亀差åãšå ±çšåããµããŒãããèšèª
å€ãã®ææ°ã®èšèªã¯ã亀差åãšå ±çšåããµããŒãããŠããŸããæ¬¡ã«äŸã瀺ããŸãã
- TypeScriptïŒäº€å·®åãšå ±çšåã®äž¡æ¹ã«å¯Ÿããå ç¢ãªãµããŒããæäŸããŸãã
- FlowïŒJavaScriptçšã®éçåãã§ãã«ãŒã§ããããããã®åããµããŒãããŠããŸãã
- ScalaïŒäº€å·®åïŒ`with`ã䜿çšïŒãšå ±çšåïŒScala 3ã§`|`ã䜿çšïŒããµããŒãããŸãã
亀差åãšå ±çšåã¯ãããæè»ã§è¡šçŸåè±ããªåã·ã¹ãã ãäœæããããã®åŒ·åãªããŒã«ã§ãããããã¯ãè€éãªããŒã¿æ§é ãšAPIã®ã¢ãã«åã«ç¹ã«åœ¹ç«ã¡ãŸãã
åæšè«ïŒãã€ã©ãŒãã¬ãŒããåæžããå¯èªæ§ãåäžããã
åæšè«ã¯ãæç€ºçãªå泚éãªãã«ãåã·ã¹ãã ã倿°ãšåŒã®åãèªåçã«æšæž¬ããæ©èœã§ããããã«ããããã€ã©ãŒãã¬ãŒãã³ãŒããå€§å¹ ã«åæžããã³ãŒãã®å¯èªæ§ãåäžãããããšãã§ããŸãã
åæšè«ã®ä»çµã¿
åæšè«ã¢ã«ãŽãªãºã ã¯ã倿°ãŸãã¯åŒã䜿çšãããã³ã³ããã¹ããåæããŠããã®åãæ±ºå®ããŸããããšãã°ã倿°ã«å€`5`ãå²ãåœãŠãããŠããå Žåãåã·ã¹ãã ã¯ãã®åã`number`ïŒãŸãã¯äžéšã®èšèªã§ã¯`int`ïŒã§ãããšæšæž¬ã§ããŸãã
äŸïŒHaskellïŒïŒ
add x y = x + y -- åã·ã¹ãã ã¯ãxãšyãæ°å€ã§ãããšæšæž¬ããŸã
ãã®Haskellã®äŸã§ã¯ãåã·ã¹ãã ã¯`+`æŒç®åã«åºã¥ããŠ`x`ãš`y`ãæ°å€ã§ãããšæšæž¬ã§ããŸãã
åæšè«ã®å©ç¹
- ãã€ã©ãŒãã¬ãŒãã®åæžïŒæç€ºçãªå泚éã®å¿ èŠæ§ããªãããã³ãŒããããç°¡æœã«ããŸãã
- å¯èªæ§ã®åäžïŒå宣èšã§ã¯ãªããã³ãŒãã®ããžãã¯ã«çŠç¹ãåœãŠãŸãã
- çç£æ§ã®åäžïŒåã·ã¹ãã ãåãèªåçã«æšæž¬ããããšã«äŸåããããšã«ãããã³ãŒããããè¿ éã«äœæããŸãã
匷åãªåæšè«ãåããèšèª
匷åãªåæšè«æ©èœã§ç¥ãããèšèªã«ã¯ã次ã®ãããªãã®ããããŸãã
- HaskellïŒHindley-Milneråã·ã¹ãã ã䜿çšããåæšè«ã®ãã€ãªãã¢ã
- MLãã¡ããªãŒïŒOCamlãStandard MLãFïŒïŒïŒHindley-Milneråã·ã¹ãã ã«ãåºã¥ããŠããŸãã
- RustïŒå®å šæ§ãšæè»æ§ã®ãã©ã³ã¹ãåãæŽç·Žãããåæšè«ã·ã¹ãã ã䜿çšããŠããŸãã
- SwiftïŒiOSããã³macOSéçºçšã®Appleã®ããã°ã©ãã³ã°èšèªã
- KotlinïŒJVMãAndroidãããã³ãã©ãŠã¶ãŒçšã®ææ°èšèªã
åæšè«ã¯ãéçã«åä»ããããèšèªããã芪ãã¿ããããçç£çã«ãã貎éãªæ©èœã§ããéçåä»ãã®å©ç¹ãšåçåä»ãã®ç°¡æœãã®ãã©ã³ã¹ãåããŸãã
åã·ã¹ãã ã®æªæ¥
åã·ã¹ãã ã®ç ç©¶ã¯ãå¯èœãªããšã®éçãæŒãåºãç¶ããŠããŸããæ°èã®ãã¬ã³ãã«ã¯ã次ã®ãããªãã®ããããŸãã
- ãªãã¡ã€ã³ã¡ã³ãåïŒè«çè¿°èªã«ãã£ãŠæ¹è¯ãããåãããæ£ç¢ºãªããã°ã©ã 仿§ãå¯èœã«ãªããŸãã
- ç·åœ¢åïŒãªãœãŒã¹ãæ£ç¢ºã«1å䜿çšãããããšãä¿èšŒããåãã¡ã¢ãªãªãŒã¯ããã®ä»ã®ãªãœãŒã¹é¢é£ã®ãšã©ãŒãé²ããŸãã
- ã»ãã·ã§ã³åïŒåæå®è¡ããã»ã¹éã®éä¿¡ãããã³ã«ãèšè¿°ããåãå®å šã§ä¿¡é Œæ§ã®é«ãéä¿¡ãä¿èšŒããŸãã
- 代æ°ç广ã·ã¹ãã ïŒååçãªæ¹æ³ã§å¯äœçšãåŠçããæ¹æ³ãã³ãŒããããã¢ãžã¥ãŒã«åããã³ãã¹ãå¯èœã«ããŸãã
ãããã®é«åºŠãªæ©èœã¯ããœãããŠã§ã¢éçºãããä¿¡é Œæ§ãé«ããå®å šã§å¹ççã«ããå¯èœæ§ãç§ããŠããŸããåã·ã¹ãã ã®ç ç©¶ãé²ãã«ã€ããŠãéçºè ãé«å質ã®ãœãããŠã§ã¢ãæ§ç¯ã§ããããã«ãããããã«æŽç·ŽãããããŒã«ãšãã¯ããã¯ãç»å Žããããšãäºæ³ãããŸãã
çµè«
é«åºŠãªåã·ã¹ãã ã¯ããœãããŠã§ã¢éçºã®æ¹æ³ãå€é©ããŠããŸããæ£ç¢ºãªããã°ã©ã ã®äžå€æ¡ä»¶ããšã³ã³ãŒãããäŸååãããåçåä»ããšéçåä»ãã®éã®ã®ã£ãããåããæŒžé²çåä»ããŸã§ããããã®æ©èœã¯ãã³ãŒãã®æ£ç¢ºæ§ãä¿èšŒããããã°ã©ã ã®ä¿å®æ§ãåäžãããéçºè ã®çç£æ§ãåäžãããããã®åŒ·åãªããŒã«ãæäŸããŸãããããã®é²æ©ãåãå ¥ããããšã«ãããéçºè ã¯ã°ããŒãã«ãªãªãŒãã£ãšã³ã¹åãã«ãããä¿¡é Œæ§ãé«ããå®å šã§å¹ççãªãœãããŠã§ã¢ãæ§ç¯ã§ããŸãã
ææ°ã®ãœãããŠã§ã¢ã®è€éããå¢ããŠãããããæŽç·ŽãããããŒã«ãšãã¯ããã¯ãå¿ èŠã§ããé«åºŠãªåã·ã¹ãã ã®æ©èœãçè§£ããæ¡çšããããšã«æè³ããããšã¯ã次äžä»£ã®é«å質ãœãããŠã§ã¢ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®éèŠãªã¹ãããã§ãã