著者:井上 健太
はじめに
Elmは主にweb開発等の対話型アプリケーションに使用される純粋関数型言語の1つで、シンプルさ、簡単さがその特徴になっています。さらに公式のチュートリアルが分かりやすく作られているため、web開発や関数型言語の初心者にオススメの言語です。
本記事では、そのElmを見ながらwebアプリや関数型言語の特徴をまとめていきます。
webアプリの仕組み
ElmではThe Elm Architectureと呼ばれるモジュールを使って簡単にwebアプリを作ることができます。 これを詳しく見ていきましょう。
まず、webアプリの基本的な仕組みであるBrowser.sandbox
を見ていきます。
import Browser
import Html exposing (Html, button, div, text)
import Html.Events exposing (onClick)
main =
Browser.sandbox { init = init, update = update, view = view }
Browser.sandbox
はinit
, update
,
model
の3要素からなり、それぞれ任意の型Model
, Msg
に対し、以下のような型を持っています。
init : Model
update : Msg -> Model -> Model
view : Model -> HTML Msg
このことからupdate
はMsg
とModel
からModel
を返し、view
はModel
からHTML Msg
を返すことがわかります。
つまり、webアプリの仕組みとしては以下の図になります。
init
がシステムの初期値です。
view
は上の矢印で、システムからModel
型の値を受け取り返り値のHTML Msg
からHTMLをブラウザに表示します。
update
は下の矢印で、ブラウザからの入力であるMsg
型の値を受け取り、元々持っていたModel
型の値を新しい値に更新します。
例はElmの公式チュートリアルにもあるように、ボタンを押すと数字が増えるwebアプリを見るのがわかりやすいでしょう。
-- INIT
type alias Model = Int
init : Model
init = 0
-- UPDATE
type Msg = Increment | Reset
update : Msg -> Model -> Model
update msg model =
case msg of
Increment -> model + 1
Reset -> 0
-- VIEW
view : Model -> Html Msg
view model =
div []
[ div [] [ text (String.fromInt model) ]
, button [ onClick Increment ] [ text "+" ]
, button [ onClick Reset ] [text "reset" ]
]
この例だとModel
がInt
型の値で、初期値init
は0
を与えておきます。view
がこの値を受け取って、ブラウザに値の表示とIncrement
かReset
を返すボタンを表示しています。
update
はブラウザからIncrement
かReset
のどちらが押されたかという情報を受け取って、Model
の値を更新する関数になっています。
Elmを使ってわかること
Elmは純粋関数型言語であるので、全ての関数はその引数のみに依存します。
すなわち上のinit
, update
, view
は全て独立した関数であり、webアプリはこの3つの独立した機構から構成されていることが分かります。
このように関数型言語ならば、複雑なプログラムも型と関数によって大枠に分解して考えることができます。これこそが関数型プログラミングの大きなメリットの1つになっています。
まとめ
純粋関数型言語Elmを用いてwebアプリの仕組みと関数型言語を用いるメリットについてまとめました。