This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 5 years have passed since last update.

Elm in Action, chapter 4: Talking to Servers(その2)

Last updated at Posted at 2016-12-11

Chapter 4: Taking to Servers

学んだこと、目に留まった箇所

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つなのも共通:amsg
  • 2つの引数も類似してる
    • メッセージを返す関数
    • Generator aRequest 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.getStringRequest String型を戻り値であることを利用して2つめの引数に指定してる
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up