Elmは、信頼できるWebアプリケーションを作るための楽しい言語です。エラーメッセージは親切で、性能も高く、アセットも小さく、そして実行時例外がありません。
おそらくElmで最も有名で、広くまねされているのがThe Elm Architectureです。これはWebアプリケーションを組み立てるためのシンプルなパターンで、ElmのWebアプリケーションはすべてこの形で書かれます。
中心となる考え方は、アプリケーションの状態を表すModel、そのモデルをupdateする方法、そしてモデルをviewする方法を軸にコードを組み立てるというものです。
Modelにはアプリケーションの状態、つまりアプリケーションが必要とするすべてのデータが入ります。テキストボックスと、そのテキストを逆にした文字を表示するテキストだけのシンプルなアプリケーションを想像すると、モデルは次のようになります。この例は、Elmガイドでも確認できます。
type alias Model =
{ text : String
}
updateは、変化があったとき(たとえばユーザーがボタンをクリックしたとき)にMsgとともに呼び出される関数です。Msgと現在のModelを受け取り、新しいModelを返します。
type Msg
= TextChanged String
update : Msg -> Model -> Model
update msg model =
case msg of
TextChanged newText ->
{ model | text = newText }
viewは、ブラウザーでユーザーに表示するHTMLを返す関数です。現在のModelを受け取り、Html Msg(ElmがHTMLを表すために使う型)を返します。
view : Model -> Html Msg
view model =
Html.div []
[ Html.input
[ Html.Attributes.placeholder "Text to reverse"
, Html.Attributes.value model.text
, Html.Events.onInput TextChanged
]
[]
, Html.div [] [ Html.text (String.reverse model.text) ]
]
友人のPaulaは、クロスワードのヒントを解くのがもっと上手くなりたいと思っています。彼女は、答えが回文であることを示すヒントもあるということを読んだのです。 回文とは、前から読んでも後ろから読んでも同じになる単語や文のことです。
そこで彼女は、文字列が回文かどうか(そうでないか)を確認する、ごく簡単なウェブサイトを書いてほしいと頼んできました。自分の予想を確認できるようにするためです。
これをElmの[サンドボックス][browser-sandox]アプリケーションで作ることにします。
このアプリケーションには、Paulaが予想を入力するテキストボックスと、そのボックス内のテキストが回文かどうかを示すテキストがあります。 テキストは、テキストボックスの中身が変わるたびに更新されます。
Model型とMsg型を定義し、init関数を書きましょうアプリケーションのModelには、確認する文字列が必要です。このフィールドはcontentという名前にします。
アプリケーションには、テキストボックス内のテキストが変わったことを示すMsgが必要です。
これのバリアントはChangeという名前にします。
init関数は、contentフィールドが空の初期Model値を返すようにします。
update関数を書きましょうupdate関数は、MsgとModelを仮引数として受け取り、新しいModelを返すようにします。
Msgはユーザーが入力したテキストを運び、新しいModelにはそのテキストが含まれているようにします。
view関数を書きましょうElmでは、view関数はHtml msg型を返す必要があります。つまり、view関数からは単一の要素を返す必要があり、要素の配列を返してはいけません。
このルート要素の中には、input要素(テキストボックス)と、input内のテキストが回文かどうかを示すtextを内容とするdivを置きます。
テキストは"This is a palindrome"または"Not a palindrome"とします。
main関数を書きましょうmain関数は、Browser.sandboxを呼び出し、init、update、viewの各関数を持つレコードを仮引数として渡します。
この演習をExercismのオンラインエディターで動かすために、コードでは偽のBrowser.sandboxを使っています。
これは、この演習を解くために書くコードには何の影響もありません。