1. F#ãšã¯
ããã°ã©ãã³ã°èšèªã®äžçã¯ããŸããŸãªçš®é¡ã®èšèªã§è±å¯ã«åœ©ãããŠããããã®äžã§ãF#ã¯ç¹ã«æ³šç®ãããŠããŸããããã§ã¯ãåããŠãã®ååãè³ã«ããããªãã«ãF#ãäœã§ããã®ãæŠèŠãã説æããŠãããŸãã
1.1 F#ã®æŠèŠ
F#ã¯ã匷åãªããŒã«ã»ãããšäžè²«æ§ã®ããææ³ãåãããã¢ãã³ãªé¢æ°åããã°ã©ãã³ã°èšèªã§ãã.NETãã¬ãŒã ã¯ãŒã¯äžã§åäœããããŸããŸãªçš®é¡ã®ãœãããŠã§ã¢éçºã«é©ããŠããŸãããªããžã§ã¯ãæåãåœä»€åã䞊è¡èšç®ãªã©ãžã®å¯Ÿå¿ãåªããŠããããã®å¯èœæ§ã¯ç¡é倧ã§ãã
1.2 F#ã®ç¹åŸŽ
F#ã¯ãä»ã®èšèªãšã¯äžç·ãç»ãããã€ãã®ç¹æ§ãæã£ãŠããŸãããŸããF#ã¯ãéçåä»ããšåæšè«ãåããŠããŸããããã«ãããã³ãŒããã¯ãªãŒã³ã§å®å šæ§ãé«ããªããŸãããŸããé¢æ°åããã°ã©ãã³ã°ã«äž»çŒã眮ããŠãããããããŒã¿å€æã®äžè²«æ§ãšå¹çæ§ã匷調ãããŠããŸããããã«ãF#ã¯è¡šçŸåãè±ãã§ãäžè¬çãªåé¡ã«å¯ŸããŠçŽèŠ³çãªè§£æ±ºçãæäŸããŸãã
1.3 F#ã®åªããç¹
F#ã®åªããŠããç¹ã¯å€ãã§ãããç¹ã«3ã€ã®ç¹ãæããŠã¿ãŸãã第äžã«ãF#ã¯éçåä»ããšåæšè«ãæã€ãããã°ã®çºçãå€§å¹ ã«åæžããã³ãŒãã®å質ãåäžãããŸãã第äºã«ãé¢æ°åããã°ã©ãã³ã°ã®ç¹æ§ã掻ããããšã§ãããã©ãŒãã³ã¹ã®åäžãã¹ã±ãŒã©ãã«ãªãœãªã¥ãŒã·ã§ã³ã®å®çŸã䞊è¡æ§ãšäžŠåæ§ã®ãµããŒããå¯èœã«ãªããŸãã第äžã«ãF#ã¯.NETãã¬ãŒã ã¯ãŒã¯ãšã®èŠªåæ§ãé«ããæ¢åã®C#ã³ãŒããã©ã€ãã©ãªãå©çšããããšãã§ããŸãããããã®ç¹ããããF#ãããããã®ããã°ã©ããŒããæ¯æãããŠããçç±ããããã§ãããã
2. F# ãã¬ãŒã ã¯ãŒã¯ã®çŽ¹ä»
2.1 ãã¬ãŒã ã¯ãŒã¯ãšã¯
äžèšã§èšãã°ããã¬ãŒã ã¯ãŒã¯ã¯ãœãããŠã§ã¢éçºã®ãåãã®ãããªãã®ã§ãããœãããŠã§ã¢ãæäŸããæ©èœãåäœã決å®ããåºæ¬æ§é ã§ãéçºè ã¯ãã®ãã¬ãŒã ã¯ãŒã¯ã«åŸã£ãŠããã°ã©ã ãæžãããšã§ãå¿ èŠãªãœãããŠã§ã¢ãå¹çè¯ãå®æãããããšãã§ããŸãã
å ·äœçã«ã¯ããã¬ãŒã ã¯ãŒã¯ã¯è€éãªåé¡ã解決ããããç¹å®ã®çš®é¡ã®ãœãããŠã§ã¢ãéçºãããããã®ãç°¡åã«ããããã®ããŒã«ãã©ã€ãã©ãªãããã³ã¬ã€ãã©ã€ã³ã®éãŸãã§ãã
2.2 F# ãã¬ãŒã ã¯ãŒã¯ã®å¿ èŠæ§
F#ã¯ããã°ã©ãã³ã°èšèªã®äžçš®ã§ã匷åãªæ°åŠçè¡šçŸåãšéçåæ€æ»ãæã€ãªã©ãæ§ã ãªç¹åŸŽãæã£ãŠããŸãããã®ãããé«åºŠãªã¢ã«ãŽãªãºã ãå®è£ ãããã倧éã®ããŒã¿ãåŠçãããœãããŠã§ã¢ãäœãã®ã«éåžžã«é©ããŠããäžæ¹ã§ããã®ç¹æ§ãæ倧éã«æŽ»çšããããéçºç°å¢ãæŽåããããã«ã¯ãé©åãªãã¬ãŒã ã¯ãŒã¯ãå¿ èŠã§ãã
F# ãã¬ãŒã ã¯ãŒã¯ã¯ãF#ã®ç¹æ§ã掻ãããããããã°ã©ãã³ã°ã®æéãæäŸãããããããç¹å®ã®éçºç¶æ³ã«æé©åãããŠããŸããäŸãã°ãWebéçºã«ç¹åãããã¬ãŒã ã¯ãŒã¯ã§ããã°ãF#ã®ç¹æ§ã掻ãããå®å šã«å¹ççãªWebã¢ããªã±ãŒã·ã§ã³ãéçºããçºã®ã¬ã€ãã©ã€ã³ãã©ã€ãã©ãªãæäŸããŸãã
ãã®ããã«ãF# ãã¬ãŒã ã¯ãŒã¯ã¯ãèªåã®éçºç¶æ³ã«åãããå¹ççã§ç¢ºå®ãªéçºãæ¯æŽããF#ã®åãåŒãåºãçºã®ããŒã«ãšãªããŸãã
3. F#ã§å©çšã§ããäž»èŠãªãã¬ãŒã ã¯ãŒã¯
F#ã¯æ©èœæ§ãšç°¡æœããå Œãåããããã°ã©ãã³ã°èšèªã§ããã®æ§è³ªã掻ããããã®æ§ã ãªãã¬ãŒã ã¯ãŒã¯ãååšããŸãã次ã«ããã®æåãªãã®ãåãäžããŸããäžã€ç®ã¯Webéçºãè¡ãããã®Giraffeãäºã€ç®ã¯ããŒã¿ãã¬ãŒã ã¯ãŒã¯ã®DeedleããããŠäžã€ç®ã¯GUIéçºãæå©ãããAvaloniaã§ãã
3.1 Webéçºçšãã¬ãŒã ã¯ãŒã¯- Giraffe
Giraffeã¯ãF#ç¹æã®é¢æ°åã¹ã¿ã€ã«ã掻ãããWebéçºãè¡ãããã®ãã¬ãŒã ã¯ãŒã¯ã§ããããã¯ASP.NET Coreã®äžäœã¬ã€ã€ãŒã§åäœããŸãããã®ãã¬ãŒã ã¯ãŒã¯ã¯ãããŒã¿ããªãã£ãšããã©ãŒãã³ã¹ãäž¡ç«ãã€ã€ãéçºè ã«F#ã®å©ç¹ãæ倧éã«æäŸããŸããç°ãªãã¿ã€ãã®ã«ãŒã¿ãŒãçšæãããŠããŸããããã©ã³ãã£ã³ã°ããŒãžãAPIãšã³ããã€ã³ãã®èšå®ãæ軜ã«è¡ããã®ã§ãã
3.2 ããŒã¿åæçšãã¬ãŒã ã¯ãŒã¯ – Deedle
次ã«æããã®ã¯ãããŒã¿åæã«ç¹åãããã¬ãŒã ã¯ãŒã¯ã§ããDeedleã§ããããŒã¿ã®æ€çŽ¢ãéèšãã°ã«ãŒãåãªã©ãäžè¬çãªããŒã¿æäœãç°¡åã«è¡ããããèšèšãããŠããŸãããããããã®ãã¬ãŒã ã¯ãŒã¯ã¯F#ã®åæšè«æ©èœãæ倧éã«æŽ»çšããŠãããããããŒã¿æäœã®è¡šçŸãçŽæçãã€ççž®ãããŠããŸããèªç¶ãªåœ¢ã§æ§ã ãªé«åºŠãªããŒã¿å€æãè¡ãããšãå¯èœãªã®ã§ãã
3.3 GUIéçºçšãã¬ãŒã ã¯ãŒã¯ – Avalonia
æåŸã«èª¬æããã®ã¯ãGUIéçºçšãã¬ãŒã ã¯ãŒã¯ã®Avaloniaã§ãããã®ãã¬ãŒã ã¯ãŒã¯ã¯ãã¯ãã¹ãã©ãããã©ãŒã ã¢ããªã±ãŒã·ã§ã³ã®éçºãæå©ãããŸããWindowsãLinuxãmacOSã§åäœããäžã€ã®ã³ãŒãããŒã¹ãéçºããããšãå¯èœãšãªã£ãŠããŸããXAMLã䜿çšããŠUIãå®çŸ©ã§ããMVVMãã¿ãŒã³ããµããŒãããŠããŸããããã«ãããF#ã䜿çšããã¢ããªã±ãŒã·ã§ã³ã®ããžãã¯ãã¯ãªãŒã³ã«ä¿ã€ããšãã§ããã®ã§ãã
4. åãã¬ãŒã ã¯ãŒã¯ã®åºæ¬çãªäœ¿ãæ¹
F#ãã¬ãŒã ã¯ãŒã¯ã®æçšãªç¹åŸŽã®äžã€ã¯ããã®ç°¡äŸ¿ããšæ軜ãã§ããããã§ã¯ãäž»èŠãªF#ãã¬ãŒã ã¯ãŒã¯ã§ããGiraffeãDeedleããããŠAvaloniaã®åºæ¬çãªäœ¿ãæ¹ã解説ããŸãã
4.1 Giraffeã®åºæ¬çãªäœ¿ãæ¹
Giraffeã¯ãF#ã§Webéçºãè¡ãããã®ãã¬ãŒã ã¯ãŒã¯ã§ããASP.NET Coreãšçµ±åãããŠãããæšæºçãª.NETãã€ãã©ã€ã³ããµããŒãããŠããŸãã
Giraffeãæ°èŠãããžã§ã¯ãã§äœ¿çšããã«ã¯ããŸãNuGetããã±ãŒãžãããŒãžã£ãéããŠGiraffeããããžã§ã¯ãã«è¿œå ããŸãããã®åŸãã¹ã¿ãŒãã¢ãããã¡ã€ã«ã§Giraffeããã«ãŠã§ã¢ãASP.NET Coreãã€ãã©ã€ã³ã«è¿œå ããããšã§èšå®ãå®äºããŸãã
services.AddGiraffe()
ããã§Giraffeã®èšå®ã¯å®äºã§ãã次ã«ãHTTPãªã¯ãšã¹ãããã³ãã«ããããã®ã«ãŒããäœæããŸããåçŽãªGETãªã¯ãšã¹ããäœæããäŸã以äžã«ç€ºããŸãã
let webApp = choose [ route "/hello" >=> text "Hello, world!" ] let configureApp (app : IApplicationBuilder) = app.UseGiraffe webApp
以äžã®æé ã§ãGiraffeãçšããåºæ¬çãªWebã¢ããªã±ãŒã·ã§ã³ã®äœæãè¡ãããšãã§ããŸãã
4.2 Deedleã®åºæ¬çãªäœ¿ãæ¹
Deedleã¯ãF#ã§ããŒã¿åæãè¡ãããã®ã©ã€ãã©ãªã§ããDeedleã䜿çšãããšã倧éã®ããŒã¿ãå¹ççã«æ±ãããšãã§ããŸãã
Deedleã䜿çšããŠããŒã¿ãã¬ãŒã ãäœæããåºæ¬çãªæé ã¯ä»¥äžã®éãã§ãããŸãããŒã¿ãããŒããããã®åŸã§ãã£ã«ã¿ãªã³ã°ã䞊ã³æ¿ããè¡ããŸãã次ã«ç€ºãã®ã¯ãCSVãã¡ã€ã«ããããŒã¿ãèªã¿èŸŒã¿ããã®äžã®ç¹å®ã®åãéžæããäŸã§ãã
open Deedle let df = Frame.ReadCsv("data.csv") let selected = df.Columns.[["Column1", "Column2"]]
ãã®ããã«DeedleãçšãããšãF#ã§ããŒã¿åæãè¡ãã®ããã£ãšç°¡åã«ãªããŸãã
4.3 Avaloniaã®åºæ¬çãªäœ¿ãæ¹
Avaloniaã¯ãF#ã§ã¯ãã¹ãã©ãããã©ãŒã GUIã¢ããªã±ãŒã·ã§ã³ãéçºããããã®ãã¬ãŒã ã¯ãŒã¯ã§ããAvaloniaãçšããããšã§ãäžã€ã®ã³ãŒãããŒã¹ã§WindowsãMacãLinuxäžã§çšŒåããã¢ããªã±ãŒã·ã§ã³ãéçºããããšãåºæ¥ãŸãã
Avaloniaã䜿çšããã«ã¯ããŸãNuGetããã±ãŒãžãããŒãžã£ãéããŠAvaloniaãšAvalonia.ReactiveUIããããžã§ã¯ãã«è¿œå ããŸãã
次ã«ãæ°èŠWindowã¯ã©ã¹ãäœæããŸãããã®ã¯ã©ã¹ã¯ãŠãŒã¶ã€ã³ã¿ãŒãã§ãŒã¹ã®ã«ãŒããšãªããŸããäŸãã°ã次ã®ãããªã³ãŒãã§Windowã¯ã©ã¹ãäœæã§ããŸãã
open Avalonia open Avalonia.Controls open Avalonia.Markup.Xaml type MainWindow() as this = inherit Window() do this.InitializeComponent() member x.InitializeComponent() = AvaloniaXamlLoader.Load(this)
ããã«ãŠãAvaloniaãçšããŠGUIã¢ããªã±ãŒã·ã§ã³ãéçºããæºåãæŽããŸãããåã ã®ãã¬ãŒã ã¯ãŒã¯ãçç·ŽããŠäœ¿ãããªãããšããF#ã䜿ã£ãéçºã®éµãšãªãããšãèŠããŠãããŠãã ããã
5. F# ãã¬ãŒã ã¯ãŒã¯ãçšãããããžã§ã¯ãã®é²ãæ¹
F# ãã¬ãŒã ã¯ãŒã¯ãçšãããããžã§ã¯ãã®é²ãæ¹ã¯ãäžè¬çãªãœãããŠã§ã¢éçºã®æµããšå€§ããå€ããã¯ãããŸããããã ãF#ç¹æã®ç¹åŸŽã掻ãããããã«ãã¬ãŒã ã¯ãŒã¯ã®æäŸããæ©èœãäžæãå©çšããããšã§ãå¹çè¯ãéçºãå¯èœãšãªããŸãã以äžã«ããããžã§ã¯ããé²ããéã®å ·äœçãªæé ãã玹ä»ããŸãã
5.1 ãããžã§ã¯ãã®æ§ç¯
ãŸãã¯ããã«ãããžã§ã¯ãã®æ§ç¯ãè¡ããŸããF#ã§ã¯ã.NET Coreã®dotnet new
ã³ãã³ããçšããŠãç°¡åã«ãããžã§ã¯ããäœæã§ããŸãããã¬ãŒã ã¯ãŒã¯ããšã«å°çšã®ãã³ãã¬ãŒããæäŸãããŠããã®ã§ããããå©çšããããšã§ãå¿
èŠãªãã¡ã€ã«æ§æãèšå®ãèªåçã«çæãããæéãçãããšãã§ããŸãã
5.2 ã³ãŒãã®æžãæ¹ãšãã¹ãæ¹æ³
F#ã¯ãæ©èœçãªããã°ã©ãã³ã°ãã©ãã€ã ãæ¡çšããŠãããããã³ãŒãã®æžãæ¹ã«ã¯ç¹åŸŽããããŸããå
·äœçã«ã¯ãå€æ°ã«å€ãå代å
¥ããããšãåºæ¬çã«ã¯èš±ãããã代ããã«äžå€ãªããŒã¿ãæäœããlet
ãã€ã³ãã£ã³ã°ãã匷åãªåæšè«æ©èœã掻çšããããšãæ±ããããŸããããã«ãåçš®ãã¬ãŒã ã¯ãŒã¯ã®æäŸããAPIã掻çšããããšã§ãããç°¡æœã§å¯èªæ§ã®é«ãã³ãŒããæžãããšãã§ããã§ãããã
ãŸããå質ãä¿ã€ããã«ã¯ããã¹ãã¯æ¬ ãããŸãããF#ã§ã¯ããŠããããã¹ããã¬ãŒã ã¯ãŒã¯ãšããŠxUnit.net
ãNUnit
ãªã©ãå©çšã§ããŸãããããã掻çšããããšã§ãäœæããã³ãŒããæåŸ
éãã«åäœããããšã確èªããããšãã§ããŸãã
5.3 ãã¬ãŒã ã¯ãŒã¯ãçšããéçºã®ã³ã
ãã¬ãŒã ã¯ãŒã¯ãçšããç®çã¯ãäžè²«ããã¢ãŒããã¯ãã£ãä¿ã¡ãªãããè€éæ§ã管çããããšã§ããDRY(Don’t Repeat Yourself)ååãå®ãããšã¯éèŠã§ãããŸãããã¬ãŒã ã¯ãŒã¯ãæäŸããæ©èœãæœè±¡åã¡ã«ããºã ãç解ããæ倧éã«æŽ»çšããŸããããããã«ãããéçºå¹çããœãŒã¹ã³ãŒãã®å質ãåäžãããããšãã§ããä¿å®æ§ãæ ä¿ããŸãã
6. F# ãã¬ãŒã ã¯ãŒã¯ã«é¢ããè±ç¥è
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãF# ãã¬ãŒã ã¯ãŒã¯ãæ±ãäžã§ã®æ³šæç¹ããšãã¹ããŒãã®ãã¥ãŒãã€ã³ããããã«ã¯F# ãã¬ãŒã ã¯ãŒã¯ã®ä»åŸã«ã€ããŠæãäžããŠãããŸããããã«ãããããæ·±ãç解ãšå¹æçãªå©çšæ³ã身ã«ã€ããŠãããŸãããã
6.1 F# ãã¬ãŒã ã¯ãŒã¯ãæ±ãäžã§ã®æ³šæç¹
F# ãã¬ãŒã ã¯ãŒã¯ãæ±ãäžã§æãéèŠãªã®ã¯ãé©ãããã¬ãŒã ã¯ãŒã¯ã®éžæã§ãã ãã®ããããã¬ãŒã ã¯ãŒã¯ã®éžæã«ããã£ãŠã¯ãè€æ°ã®éžæè¢ãæ€èšããããããã®ç¹æ§ãçšéãåŠç¿ã³ã¹ããªã©ãæ éã«æ¯èŒããããšãéèŠã§ãããŸãããã¬ãŒã ã¯ãŒã¯èªäœãæŽæ°ãããã¿ã€ãã³ã°ã§ãå€åããããããå®æçã«ææ°ã®æ å ±ããã§ãã¯ããèªå·±åŠç¿ã®å§¿å¢ãå¿ èŠã§ãã
6.2 F# ãã¬ãŒã ã¯ãŒã¯ã®ãšãã¹ããŒããèªãç§èš£
F# ãã¬ãŒã ã¯ãŒã¯ã®ãšãã¹ããŒãã¯ã¿ãªæ¢æ±å¿ãæã£ãŠããŸããã©ããªåé¡ããé©åãªãã¬ãŒã ã¯ãŒã¯ãçšããŠããããšã§ãè¿ éã«è§£æ±ºçãèŠã€ããŠçµæãåºãããšèªã£ãŠããŸãããšãã¹ããŒãã«ãªãããã«ã¯ãå ±æã®ç¥èã ãã§ãªãç¬èªã®çµéšãæŽå¯ã倧åã§ãããã®ãããå®æçãªå®è·µãéããŠã¹ãã«ãé«ããŠããããšãéèŠã§ãã
6.3 ããããã®F# ãã¬ãŒã ã¯ãŒã¯ã®å¯èœæ§
ããããã®F# ãã¬ãŒã ã¯ãŒã¯ã®å¯èœæ§ã«ã€ããŠèãããšããå€æ§åããéçºããŒãºã«å¯Ÿå¿ããããã®æ°ããªãã¬ãŒã ã¯ãŒã¯ã®ç»å Žãæ¢åãã¬ãŒã ã¯ãŒã¯ã®æ¹è¯ãäºæ³ãããŸãããŸããã¯ã©ãŠãã³ã³ãã¥ãŒãã£ã³ã°ãããŒã¿ãµã€ãšã³ã¹ãAI (人工ç¥èœ) ãªã©ã®é²å±ã«äŒŽããF# ãã¬ãŒã ã¯ãŒã¯ã«ããããã®æè¡ãçã蟌ãåããèŠããããã§ãã ããããã® F# ãã¬ãŒã ã¯ãŒã¯ã®çºå±ãèŠéããªãããã«ããææ°ã®ååãè¿œãç¶ããããšã倧åã§ãã
7. ãŸãšã
ä»åã®èšäºãéããŠãæã ã¯F# ãã¬ãŒã ã¯ãŒã¯ã®åºæ¬çãªæŠå¿µãããå ·äœçãªäœ¿ãæ¹ããããŠãããžã§ã¯ãé²è¡æã®æ³šæç¹ãŸã§ãå¹ åºãåŠã¶ããšãã§ããŸãããæãè¿ããŠã¿ãã°ãåãã«F#ã®èšèªç¹æ§ããã®åªããç¹ã玹ä»ãããã®åŸã§ããã®ç¹æ§ã掻ãããã¬ãŒã ã¯ãŒã¯ã«ã€ããŠçŽ¹ä»ããŸããã
GiraffeãDeedleãAvaloniaã®ããããã®ç¹æ§âšãšåºæ¬çãªäœ¿ãæ¹ã解説ããŸãããããããã¯ãããŸã§äžäŸã§ãããF# ãã¬ãŒã ã¯ãŒã¯ã«ã¯æ°å€ãã®çš®é¡ãååšããŸãã®ã§ãçšéãèŠä»¶ã«å¿ããŠé©åãªãã®ãéžæããããšãéèŠã§ãã
ãŸãããã¬ãŒã ã¯ãŒã¯ãçšãããããžã§ã¯ãã®é²è¡æ¹æ³ããã¹ãæ¹æ³ãéçºã®ã³ãã«ã€ããŠã解説ããŸããããããã®ãã¯ããã¯ãç解ããŠé©çšããããšã§ãããçç£çã«ããããŠå¹ççã«éçºãè¡ãããšãå¯èœãšãªããŸãã
æåŸã«ãF#ãã¬ãŒã ã¯ãŒã¯ã®æ±ãæ¹ããã®æŽ»çšèªã®è±ç¥èã«ã€ããŠè§ŠããŸããããããã®ç¥èãåãå ¥ããããšã§ãF#ãã¬ãŒã ã¯ãŒã¯ã®ãšãã¹ããŒããšããŠã®äžæ©ãèžã¿åºãããšãå¯èœãšãªããŸãã
ãã®èšäºãçããã®F# ãã¬ãŒã ã¯ãŒã¯ã«é¢ããç解ãæ·±ããå°æ¥çãªéçºäœæ¥ã«åœ¹ç«ã€äžå©ãšãªãã°å¹žãã§ãã