- Elm Advent Calendar 2016 - Adventar 11日目
- Elmの勉強の記録
- 今回は読書ノート
Chapter 4: Taking to Servers
- Richard Feldman, Elm in Action MEAP V03, pp.88-119
- 前回の続き
学んだこと、目に留まった箇所
type aliasを使うことの2つ目の意味
これも型定義が関数っぽく振る舞うという話
type alias Photo = { url : String }
-
Photo
型の定義 -
Photo
型のインスタンスを作る関数の定義-
Photo: String -> Photo
と型定義できるような関数として使える
-
type alias Model =
{ photos : List Photo
, selectedUrl : String
, chosenSize : ThumbnailSize
}
こっちは、Record
の複数フィールドがあるやつで、
Model : List Photo -> String -> ThumbnailSize -> Model
引数の順番は、フィールドの上から下の順番になる
Elmには副作用はない、という話
- じゃあ、どうやってElmアプリはアプリの外部を変化させるのか
- 依然よくわかってない部分はあるが、この章を読んで少し整理できた
-
副作用は無いが、作用(effects)を起こす仕組みがElmランタイムにある
- 一言でいうとこういうことらしい
- Elmランタイムによる外部状態を変化させる(=effects)
- このことをmanaged effectsと呼んでる
- commandという
Cmd a
という特別なデータ型-
Cmd a
型を戻り値に持つ関数を使うことで、ElmアプリケーションはElmランタイムにeffectを起こすように働きかけることができる -
Cmd a
型を返す関数も純粋関数である
-
Richardによる、副作用(と作用)のざっくりした定義
An effect is an operation that modifies external state. A function which modifies external state when it executes has a side effect. (Elm in Action (MEAP V03), p.95)
- 勿論厳密な定義とかあるんだろうが自分はこれで満足
- Elmの関数は純粋関数であることが言語レベルで強制されてる
- 関数が評価されて戻り値として値が取り出されるまでの間に、副作用を生むような処理を挟むとコンパイルが通らない
- JSなら許容されるサーバーとの通信とかログを
return
されるまでに挟むような真似ができない
- 「副作用=関数が引き起こす外部状態の変化」という定義であれば、副作用はElmには存在しない、という意味合い
-
Cmd a
型を戻り値とする関数の例-
Random.generate
(3章で取り上げてた) -
Http.send
(この章(=4章)で取り上げる)
-
Http
モジュールでCmd a
型を返す関数
-
Http.send
だけ-
Http
モジュールが提供する関数はsend
を呼び出すのに必要なパーツを提供するために使う
-
-
Cmd a
型を返す関数のシグニチャーは似てる
generate : (a -> msg) -> Generator a -> Cmd msg
send : (Result Error a -> msg) -> Request a -> Cmd msg
- 型変数は2つなのも共通:
a
とmsg
- 2つの引数も類似してる
- メッセージを返す関数
-
Generator a
とRequest a
とう型変数をとるデータ型
union typeを使ったMsg
型の定義から派生的につくられるところも共通してる
-- メッセージ定義
type Msg
= SelectByUrl String
| SelectByIndex Int
| SurpriseMe
| SetSize ThumbnailSize
-- `Cmd a`返す関数の呼び出し
Random.generate SelectByIndex randomPhotoPicker
type Msg
= SelectByUrl String
| SelectByIndex Int
| SurpriseMe
| SetSize ThumbnailSize
| LoadPhotos (Result Http.Error (List Photo))
initialCmd : Cmd Msg
initialCmd =
"http://elm-in-action.com/photos/list"
|> Http.getString
|> Http.send LoadPhotos
第二引数
-
Random.generate
ではランダムにに返す結果のデータ構造を型変数で指定した -
Request a
ではHTTPリクエストの構造を型変数で指定してる -
Http.getString
がRequest String
型を戻り値であることを利用して2つめの引数に指定してる