こんにちは、shootaceanです。
Elmで何かをつくりたくなったので フィボナッチ数列を生成するWEBアプリ をつくってみました。
こちらのサイトにホスティングしているので、ぜひ試してください!
https://web-labs.shootacean.com/elm/fibonacci/index.html
ソースコードはGitHubで確認できます!
https://github.com/shootacean/shootacean.com/blob/main/web-labs.shootacean.com/src/elm/fibonacci/src/Main.elm
バグってるよ、もっと簡単に書けるよ、などの指摘や意見があればTwitterのDMやメンションなどでお願いします!
フィボナッチ数列を計算する関数
他のプログラミング言語でもよくあるメモ化している実装です。
fibonacci : Int -> List Int -> Int
fibonacci n memo =
let
m = List.getAt n memo
in
case m of
Just memoNum -> memoNum
Nothing ->
case n of
0 -> 0
1 -> 1
_ -> ( fibonacci (n - 2) memo ) + ( fibonacci (n - 1) memo )
update処理
メモ化とViewに表示するためのリストを更新しています。
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
Increment ->
let
n = model.num + 1
fib = fibonacci n model.sequences
in
( { model | num = n, sequences = List.append model.sequences [fib] }
, Cmd.none
)
メモ化なので永続的な状態を保つ必要があるのですが、他のプログラミング言語と違ってElmはTEAに縛られています。
まだElmとTEAの理解ができていなかったので、メモ部分をどうやって持つかで1時間くらい悩んでしまいました…
TEAに従って updateで計算して model を更新する ことしかできないので、 ただいつもどおりTEA様に従うだけでよかったです。
おわりに
個人的にElmを書いていて一番嬉しいのは、HTMLとJavaScriptを行き来しないでよくなることですね。 本当にのんびりとElmを学習しているのでまだまだわからないことばかりですが、ゆったりとElm書いていこうと思います!