ML系の言語で、.NETの生態系が使える、関数型言語でアプリを作るならF♯が最強かもしれないということに気づいてしまった。
現時点では
が存在する。FuncUIはAvalonia専用なんだが、FabulousはMAUI、Avalonia、Xaramin.Forms、三つのバックエンドが使える。両方ともElm風のMVUで開発できる。
Elmishはちょっと違うのでパス。
とりあえずFabulousを使ってみることにした。
Fabulousをさわってみる
チュートリアルの手順に沿って、テンプレートからプロジェクトを生成すればは以下のサンプルコードがでてくる。
namespace FFF
open Avalonia.Themes.Fluent
open Fabulous
open Fabulous.Avalonia
open type Fabulous.Avalonia.View
module App =
type Model =
{ Count: int; Step: int; TimerOn: bool }
type Msg =
| Increment
| Decrement
| Resetof float
| SetStep of bool
| TimerToggled
| TimedTick
let initModel = { Count = 0; Step = 1; TimerOn = false }
let timerCmd () =
{
async do! Async.Sleep 200
return TimedTick
}
.ofAsyncMsg
|> Cmd
let init () = initModel, Cmd.none
let update msg model =
match msg with
| Increment ->{ model with
},
Count = model.Count + model.Step .none
Cmd
| Decrement ->{ model with
},
Count = model.Count - model.Step .none
Cmd.none
| Reset -> initModel, Cmd{ model with Step = int(n + 0.5) }, Cmd.none
| SetStep n -> { model with TimerOn = on }, (if on then timerCmd() else Cmd.none)
| TimerToggled on ->
| TimedTick ->if model.TimerOn then
{ model with
},
Count = model.Count + model.Step ()
timerCmdelse
.none
model, Cmd
let view model =
(VStack() {
($"%d{model.Count}").centerText()
TextBlock
("Increment", Increment).centerHorizontal()
Button
("Decrement", Decrement).centerHorizontal()
Button
(HStack() {
("Timer").centerVertical()
TextBlock
(model.TimerOn, TimerToggled)
ToggleSwitch})
(20.)
.margin()
.centerHorizontal
(1., 10, float model.Step, SetStep)
Slider
($"Step size: %d{model.Step}").centerText()
TextBlock
("Reset", Reset).centerHorizontal()
Button
})
()
.center
#if MOBILE
let app model = SingleViewApplication(view model)
#else
let app model = DesktopApplication(Window(view model))
#endif
let theme = FluentTheme()
let program = Program.statefulWithCmd init update app
F♯ところか、実は一行もOCamlも書いたことがないけど、意外とわかりやすい。
dotnet run -f net7.0
で実行できる。
まだ.NET8.0対応していないらしい。.NETのことよくわからないのでなんとも言えない。
dotnet build
でビルドできる。
やはり.NETはいいものだね。
F♯でなんか書いてみたいと思う。