Skip to content

Latest commit

 

History

History
266 lines (201 loc) · 9.43 KB

delightful_elm.md

File metadata and controls

266 lines (201 loc) · 9.43 KB

Elmはいいぞ

ymtszw

@ML DAY #1 LT, 2018/03/31


Speaker


Ax Me!

axe


今日は

Elm

を布教したい


elm-lang.org


Elm

  • DelighfulreliableなWebAppを書ける言語
  • ML-inspired syntax
  • 静的型付け、Immutable data、JavaScriptにコンパイル
  • The Elm Architecture
  • 専用のPackage Ecosystem
  • 本勉強会に参加している方には名前くらいは知られてるはず
  • 私の使用経験はサイドプロジェクトで約1年ほど

このスライド再生アプリもElm

  • 昨晩から突貫で作ったので粗いですが、追々いじってます
  • こんな形をしています
    • すでに原稿内のコードがmasterのコードに立ち遅れていて申し訳ない、、
-- Main.elm
main : Program Never Model Msg
main =
    Html.program
        { init = init
        , update = update
        , subscriptions = always Sub.none
        , view = View.view
        }

-- Main.elm
update : Msg -> Model -> ( Model, Cmd Msg )
update msg ({ index } as model) =
    case msg of
        NoOp ->
            ( model, Cmd.none )

        ClientRes (Ok (GetMarkdownFile filename contents)) ->
            ( { model
                | index = Dict.insert filename contents index
                , current = Just ( filename, contents )
                , cursor = 0
              }
            , Cmd.none
            )

        ...

-- Type.elm
type Msg
    = NoOp
    | ClientRes (Result Http.Error Success)
    | OpenFile String
    | CursorTo Int


type Success
    = GetMarkdownFile String (List String)


type alias Model =
    { index : Dict String (List String)
    , current : Maybe ( String, List String )
    , cursor : Int
    }

-- View.elm
view : Model -> Html Msg
view model =
    section [ class "section" ]
        [ div [ class "container is-fluid is-fullhd" ]
            [ div [ class "columns" ]
                [ aside [ class "menu column is-2" ]
                    [ p [ class "menu-label" ] [ text "INDEX" ]
                    , ul [ class "menu-list" ] <|
                        List.map
                            (\filename ->
                                li []
                                    [ a [ onClick (OpenFile filename) ]
                                        [ text (String.dropRight 3 filename) ]
                                    ]
                            )
                            slideList
                    ]
                , div [ class "column is-10" ] [ rendered model ]
                ]
            ]
        ]

...

ご覧の通り…

  • SyntaxはHaskellからの強い影響
    • ただし、バージョンを重ねるにつれてかなりdiverge
    • Explicitnessを重視
  • Tagged UnionRecordを使ってModelMsgを定義
  • HTMLタグと対応した関数で文書構造を純粋なview関数として記述
  • updateでアプリケーション内で発火されるMsgに対する状態遷移をexhaustiveに記述
    • Msgの発火は「viewで定義したDOMから」「updateの返り値として連鎖的に」 「外部からsubscriptions経由で」

The Elm Architecture

  • これが基本的なThe Elm Architecture(TEA)
  • Elmではどんなアプリも全てこのアーキテクチャのもとに開発
    • TEAでアプリケーションを開発するためのフレームワークが言語に同梱されている
  • すでに多くのフォロワーが生まれている
    • 最高かどうかは分からないまでも、近頃の最大公約数的アーキテクチャ?
    • redux, hyperapp, yew, ...

易しい型システム、優しいコンパイラ

  • ElmはHaskell/PureScriptと比較すると、型システムはかなり簡素
  • Type classはありません
    • 何かそれに変わるシステムが用意されているわけでもないので、関数overloadもできません
    • MaybeResultなどがありますが、統一されたmapはなく、Maybe.mapResult.mapを使います
  • これを含め、言語機能の策定には「とにかくexplicitに、そして初学者に優しく」という方針が徹底して貫かれています
  • コンパイラは充実したエラーメッセージやinstructionに溢れてます

副作用(IO)はElm任せ

  • (黒魔術が存在しないわけでもないですが、)基本的にユーザが書くElmプログラムは全て純粋
  • 非純粋な処理はすべてElm runtimeが非同期実行し、結果は型検査された安全な値としてMsgにenvelopeされてupdateにrouting
    • この処理実行単位をCmdと呼び、Cmdを構成する小単位がTask
  • 非Elm界(≒JS界)との対話も基本的にすべてこの経路
    • ユーザ独自にJS側で処理を記述したい場合はportという仕組みを利用、やはりCmdsubscriptionsによるインターフェイス
    • いわゆるFFIのような仕組み(Elm関数の内部動作をJSで直接実装)は、非推奨かつ次バージョンでは禁止の見込み
  • とにかく安全!これでもかとSanitizeされた環境で純粋なプログラミングに徹するのみ

安心感抜群のWebApp開発

  • 「コンパイラに優しく導かれる」という今までにないWebApp開発ができることは請け合い
    • 公式いわく、**"zero-runtime exception"**を実現可能
    • (とはいえこれは"zero-bug"というわけではないし、コンパイラバグもちょくちょくありますが)
  • あまりに気持ちいいので、最近Elixirにも満足できなくなってきた
  • Elm開発コアチームの人のセッションに、"Make the Back-End Team Jealous: Elm in Production"というタイトルがあったけど、まさにその心境

懸念点は……?


Elmは、
・導入コスト: ゼロ (amortized;フレームワークがわかりやすいしコンパイラも親切、文法の不慣れさをも相殺する)
・メンテコスト: ゼロ (コンパイラが不可能な変更は拒絶する。壊せないものは壊れないからメンテフリー)
・心理コスト: ゼロ (amortized; 導入後の幸福によって相殺される)

— Gadagarr (@gada_twt) February 21, 2018

それは冗談にしても

  • 懸念点、もちろんあります。プロダクトに使おうとする場合は十分にInformedな状態で判断しましょう
    • サイドプロジェクト・個人開発からであれば何も心配なし。というか会う人だいたい全員に薦めてる
    • 既存のアプリの一部分から使い始めることも可能だし、アプローチとしても推奨されている
  • Elmはどんな人にオススメできないか - Qiita
  • 個人的な印象でいくつかポイントを上げるなら:
    • ボイラープレートの多い言語ではあります(Explicitness/Simplicityの裏返し)
    • 言語コア周辺から離れるにつれてコード共有(ライブラリ化)がしづらくなる傾向があります
      • そもそも新興言語でライブラリが少ない、というのも
    • バージョンアップはかなり遅いです
  • このあたり、質問ありましたらぜひ

Communities and elm-jp!


Elm書いて気持ちよくなりましょう!

recruit

Thank You!