- Elm Advent Calendar 2016 - Adventar 6日目
- Elmの勉強の記録
- Richard Feldman, Elm in Action MEAP V03
- 3.3 Generating Random Numbers with Commands、を主に読んだ感想
3枚のうちの1つをランダムに表示するボタン
- これをthe Elm Architectureで実装されたアプリに追加していくと、どうなるか
- 3枚写真のサムネイルがあり、ボタンクリックしたら、ランダムに拡大表示するアプリ、という例で説明をしていた
- jsだと
Math.random()
を使ってアレコレするところ(そんなに大変じゃないところ)だが。。。 - このお題の実装がthe Elm Architectureではすんなりいかない。。。
- それはどうしてなのかを少しずつ説明してくのが面白い
- 逆に言うと、The Elm Architectureを使ってアプリ作るのに理解しないといけないことはすごく少ない
戻り値が毎回変わることは、純粋関数では起こらない
- 引数が同じなら戻り値も毎回同じ結果
- これが純粋関数(、についてのポピュラーな説明)
- Elmの関数は純粋関数
- つまり、戻り値が毎回変わるというのは、Elmでどうやって実現するの?という疑問を生み出す
- 「純粋関数だけ」という枠組みで、毎回結果が変わる処理をどう扱う?という問題提起のあとで、Elmがどういう仕組みを用意してるのか、というふうに自然に説明できている
サーバーからのデータ通信、非同期処理、DBへの書き込み
- 失敗する可能性のある(failしうる)操作とか処理を題材にすることも可能
- むしろこっちの方が多い。どうしても他に説明しないといけないことが増え、サンプルも複雑になり、わかりにくくなる
- 自分はここで挫折した派
The Elm Architectureでは、副作用は「上級編」扱い
- 学習曲線をフレンドリーにするため意図的にチョイスされてる
- サンプルアプリのTodoMVCも副作用は扱わない
- The Elm Architecture(とかサンプルのTodoMVC)を最初に学んだ人の最初のハードルが、副作用を扱う仕組み
ランダムな結果を返すために使える仕組みとしてのcommand
- 渡すオペレーション内容を書いたレシピのようなもの、命令の記述。と説明されている
- コマンドは関数が返す値として表現であり、純粋関数の戻り値の1つとして位置付けてる
- Commandに記された命令のリストを、Elmランタイムが実行する
Random.Generator Int
- ランダムな数値(
Int
型)を返すためのコマンド
update関数の戻り値にコマンドが含まれるようにする
- これがThe Elm Architectureへの導入のとっかかり、としてElm in Actionはチョイスしてる
-- before
update : Msg -> Model -> ( Model, Cmd Msg )
-- after
update : Msg -> Model -> Model
-
Model
を返していたところを、Model
とCmd Msg
のタプルを返すように変更してる -
Html
がつねに型変数をとりHtml msg
と型定義されてるようにCmd
もCmd Msg
と型定義
update関数がCmd Msg
型のデータを返すように実装する
略(あとでかく)
- こっちで、ランダムな結果を返す(サイコロ振りみたいなやつ)の実装について書いた