SlideShare a Scribd company logo
1 of 41
Download to read offline
ElmでJavascript
Shizuoka.js
@karky7
2020/12/19
1
自己紹介
twitter: @karky7
2
自己紹介
contribute
gentoo-haskellコミッタ
日本OpenSolarisユーザーグループ会
最近作ったもの
Houbouブログ作成ルーツ
Haskell Yesod + Elm
https://github.com/calimakvo/houbou
3
なぜElmなのか…
4
私が、Reactに挫折したからです…
そして、私を救ってくれたのが、Elmでした
5
Elmとは
Evan Czaplickiさん作
強い静的型付の関数型言語
Elmアーキテクチャ
javascriptトランスパイラ
6
インストール
npmでインストール、2020/12現在、バージョン0.19.1が入る
外部モジュールを利用しなければ、これだけでJavascriptを出力できます、browserifyとかBABELとかいりま
せん
$ npm install elm
7
elmコマンド
コンパイル
elm make
パッケージ管理
elm init, install, brump,…
インタラクティブ実行
elm repl
ブラウザデバッグ
elm reactor
8
elm init
プロジェクトの作成
~ $ mkdir jsproj/
~ $ cd jsproj/
~/jsproj $ elm init
Hello! Elm projects always start with an elm.json file. I can create them!
...
Knowing all that, would you like me to create an elm.json file now? [Y/n]: y
Okay, I created it. Now read that link!
Process /home/cuomo/node_modules/.bin/elm finished
~/jsproj $
9
elm repl
インタラクティブに実行や、関数の型の確認などができる
Haskellユーザーにとってはとってもフレンドリ
$ elm repl
---- Elm 0.19.1 ------------------------
Say :help for help and :exit to exit! ..
----------------------------------------
> 1 + 2
3 : number
> "ABC"
"ABC" : String
> import Html
> Html.div
<function>
: List (Html.Attribute msg) -> List (Html.Html msg) -> Html.Html msg
10
elm reactor
ブラウザデバッグのためのコマンド
$ elm reactor
Go to http://localhost:8000 to see your project dashboard.
11
Elmの文法
関数型言語
再代入の禁止
引数の部分適用
ラムダ関数
パターンマッチ
関数をつなげるパイプ(haskellでいう>>=のようなもの)
ショートサーキット(遅延評価的ななにか)
Haskellユーザーにとってはとってもフレンドリ
12
Elmアーキテクチャ
だいたい合っているとは思います…
13
Elmアーキテクチャ
Init
モデルの初期化
Update
メッセージハンドリングとモデルの更新
View
モデルの状態によって仮想DOMを更新
Port
ElmからJavascriptの呼出、JavascriptからElmの呼出
Subscription
Javascriptランタイムからの通知取得(タイマ等)
14
サンプルコード
15
Code
https://github.com/calimakvo/shizujs1.git
$ npm install
$ npm run build
$ firefox sample.html
16
モジュール
モジュールの宣言、利用するライブラリのインポートなどを行
う
module名とファイル名は合わせる必要があります
-- src/Counter.elm
module Counter exposing (main)
import Browser
import Html exposing (Html, button, div, text)
import Html.Events exposing (onClick)
17
Browser.element
埋め込み型アプリケーションを作成する場合、Browser.element
を利用します
SPAアプリケーションの場合、Browser.applicationを利用します
main : Program Int Model Msg
main =
Browser.element
{ init = init
, update = update
, view = view
, subscriptions = subscriptions
}
18
Browser.elementの型
sandboxの強化版、初期化のFlagsを取ることと、モデルとコマ
ンドのタプルを返すことが違います
Browser.element :
{ init : flags -> ( model, Cmd msg )
, subscriptions : model -> Sub msg
, update : msg -> model -> ( model, Cmd msg )
, view : model -> Html.Html msg } -> Program flags model msg
19
モデルの宣言
モデルの型を宣言します
レコードアクセスが不要なら、これでも同じです
type alias Model =
{ counter : Int }
type alias Model = Int
20
Init(初期化)
flag型をInt型と具体型にしてJavascriptからElmへ値を渡し、モ
デルの初期状態を設定します
init : Int -> (Model, Cmd Msg)
init c =
( { counter = c }, Cmd.none )
21
メッセージ
Msg型を定義します、Cmd Increment のような感じでUpdateへ送
信されてきます
type Msg
= Increment
| Decrement
22
モデル更新
メッセージによって、モデルを更新します
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
...
Decrement ->
if model.counter > 0 then
(
{ model | counter = model.counter - 1 }
, Cmd.none -- Taskを利用してコマンド発行可能です(ajax等)
)
else
(model, Cmd.none)
23
View更新
モデルが更新されると自動で呼び出されます
HTMLっぽく見えますがすべて関数です、Msgを発行するので
Html Msg 型だと思って問題ないと思います
view : Model -> Html Msg
view model =
div []
[ button [ onClick Decrement ] [ text "-" ]
, div [] [ text (String.fromInt model.counter) ]
, button [ onClick Increment ] [ text "+" ]
]
24
View更新
例えばdiv関数ですが、以下の型宣言を確認できます
> import Html
> Html.div
<funciton>
: List (Html.Attribute msg) -- divタグへ属性をセットできます
-> List (Html.Html msg) -- Increment,Decrementのイベント
-> Html.Html msg -- 上と同じ型を返す
25
Subscription
javascriptランタイムから通知を受けないので今回はなにもしま
せん、Sub.noneを返します
※ここで何かのコマンドを返すことによって、Updateが呼ばれるようになります
subscriptions : Model -> Sub Msg
subscriptions _ =
Sub.none
26
SubscriptionとPort
Coming Soon !
27
実際にhtmlから使ってみる
28
ビルド
Counter.elmをビルドして、counter.jsを出力させます
index.htmlを出力しますが、今回はコンポーネントで利用するた
めdivへカウンターサンプルを張り付かせます
$ elm make src/Counter.elm --output=counter.js
29
Html
...
<title>Counter Main</title>
<script src="counter.js"></script>
</head>
<body>
<h1>カウンターサンプル</h1>
<div id="counter"></div>
</body>
<script type="text/javascript">
var app = Elm.Counter.init({
flags: 88
, node: document.getElementById('counter')
});
</script>
</html>
30
ブラウザでアクセスする
31
別の場所で使いたければ増やすだけ
<script type="text/javascript">
var app1 = Elm.Counter.init({
flags: 88
, node: document.getElementById('counter1')
});
var app2 = Elm.Counter.init({
flags: 11
, node: document.getElementById('counter2')
});
</script>
32
ブラウザでアクセスする
33
単純で重要なこと
Viewを更新について考えるとき、最初にModelの更新を考えるだ
け
34
まとめ
35
Elmの優れているところ
とにかくシンプル
導入までにやること、覚えることが少ない
強力な型チェック、ビルドが通ればほぼ動く
Elmの世界にいれば、Javascriptの知識は不要(今のところ)
関数型(面倒な前提から解放される)
コンポーネントの再利用性が高い
36
Elmの注意点
バージョンが0.19.1なので、アップデートによっては修正が発生
する可能性
ここについては、クチョクチョになったJavascriptの保守に比べれば、そんなに心配することではない
37
参考書
関数型を勉強するエントリー書でもあり、Elmのリファレンス本で良書です
こちらを読んでもらった方が早いです
38
Shizuoka.hsについて
コロナ情勢が終焉しましたら、また関数型言語、Haskellの勉強
会を開催したいと思っていますのでご興味のある型はふるって
ご参加ください
39
ありがとうございました
40

More Related Content

Similar to Elmでjavascript

EmitJSの環境をちょこっと調べた
EmitJSの環境をちょこっと調べたEmitJSの環境をちょこっと調べた
EmitJSの環境をちょこっと調べたkyon mm
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)啓 小笠原
 
Intel AVX2を使用したailia sdkの最適化
Intel AVX2を使用したailia sdkの最適化Intel AVX2を使用したailia sdkの最適化
Intel AVX2を使用したailia sdkの最適化HitoshiSHINABE1
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発papamitra
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127Natsutani Minoru
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugY Watanabe
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8y_taka_23
 
StackStormを活用した運用自動化の実践
StackStormを活用した運用自動化の実践StackStormを活用した運用自動化の実践
StackStormを活用した運用自動化の実践Shu Sugimoto
 
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るKiyoshi SATOH
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejsTakayoshi Tanaka
 
js-ctypes - ネイティブコードを呼び出す新しいカタチ
js-ctypes - ネイティブコードを呼び出す新しいカタチjs-ctypes - ネイティブコードを呼び出す新しいカタチ
js-ctypes - ネイティブコードを呼び出す新しいカタチMakoto Kato
 
Haskell で作る競技型イベントの裏側
Haskell で作る競技型イベントの裏側Haskell で作る競技型イベントの裏側
Haskell で作る競技型イベントの裏側Nobutada Matsubara
 
jQuery+TypeScriptやってみた
jQuery+TypeScriptやってみたjQuery+TypeScriptやってみた
jQuery+TypeScriptやってみたMitsuo Kawashima
 
Using xvim with macvim
Using xvim with macvimUsing xvim with macvim
Using xvim with macvimpebble8888
 
Vim の開発環境
Vim の開発環境Vim の開発環境
Vim の開発環境eagletmt
 

Similar to Elmでjavascript (20)

MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
EmitJSの環境をちょこっと調べた
EmitJSの環境をちょこっと調べたEmitJSの環境をちょこっと調べた
EmitJSの環境をちょこっと調べた
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
Intel AVX2を使用したailia sdkの最適化
Intel AVX2を使用したailia sdkの最適化Intel AVX2を使用したailia sdkの最適化
Intel AVX2を使用したailia sdkの最適化
 
ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発ScalaでAndroidアプリ開発
ScalaでAndroidアプリ開発
 
なにわテック20180127
なにわテック20180127なにわテック20180127
なにわテック20180127
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
 
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
 
エコSmalltalk
エコSmalltalkエコSmalltalk
エコSmalltalk
 
StackStormを活用した運用自動化の実践
StackStormを活用した運用自動化の実践StackStormを活用した運用自動化の実践
StackStormを活用した運用自動化の実践
 
node+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作るnode+socket.io+enchant.jsでチャットゲーを作る
node+socket.io+enchant.jsでチャットゲーを作る
 
Embulk 20150411
Embulk 20150411Embulk 20150411
Embulk 20150411
 
Ajax 応用
Ajax 応用Ajax 応用
Ajax 応用
 
13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs13016 n分で作るtype scriptでnodejs
13016 n分で作るtype scriptでnodejs
 
js-ctypes - ネイティブコードを呼び出す新しいカタチ
js-ctypes - ネイティブコードを呼び出す新しいカタチjs-ctypes - ネイティブコードを呼び出す新しいカタチ
js-ctypes - ネイティブコードを呼び出す新しいカタチ
 
Ruby test double
Ruby test doubleRuby test double
Ruby test double
 
Haskell で作る競技型イベントの裏側
Haskell で作る競技型イベントの裏側Haskell で作る競技型イベントの裏側
Haskell で作る競技型イベントの裏側
 
jQuery+TypeScriptやってみた
jQuery+TypeScriptやってみたjQuery+TypeScriptやってみた
jQuery+TypeScriptやってみた
 
Using xvim with macvim
Using xvim with macvimUsing xvim with macvim
Using xvim with macvim
 
Vim の開発環境
Vim の開発環境Vim の開発環境
Vim の開発環境
 

Elmでjavascript