Skip to content

Elmでフィボナッチ数列を計算してみた

Posted on:2021年8月2日 at 00:00

Image from Gyazo

こんにちは、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書いていこうと思います!