なのログ

だから見てて下さい・・・俺の・・・変身

基礎からわかる Elmを読んでいます(第1回)

遂にElmに手をつけはじめました。
どうやらもう1年前の本ですが、掲載バージョンもlatestもまだ0.19.xです。よかった。


2月の勉強会の参加前にやるべき内容だった説はあります。


こんにちは。こんばんは。わたしです。

今回のネタはこちらです。
基礎からわかる Elm - C&R研究所
book.mynavi.jp

またなんともいきなりAndroid以外のネタを持ってきたなというところですが、
知人から「欲しい物リストをよこせ」と言われた数日後に届きました。やるしかないね。

というわけでやっていきますが、今回記事にする範囲はド序盤です。

全体で↓こんな6つのCHAPTERがある中、 今回はCHAPTER 02まで触るつもりです。

CHAPTER 01 * Elmをはじめよう
CHAPTER 02 * Elmの基礎文法
CHAPTER 03 * アプリケーションの作成
CHAPTER 04 * Webアプリ開発の実践
CHAPTER 05 * 設計パターン
CHAPTER 06 * 一歩先のトピック

それでも100ページを超えているので、APEXにドハマりしてしまっている割にはそれなりのスピードで今後もやっていけると思います。

全体だと4,5回くらいでやっていきたいですかね。
・・・という願望があります。どうなるかはわかりませんね。特にCHAPTER 05以降が。

では。

はじまります!(少女アニメ主人公)(つたわれ)


CHAPTER 01 インストールとハロワ

インストーラを拾うかnpm install elmをするかしろという話です。

ただ、一番伝えておきたいお話がありまして、 VSCodeの拡張が更新されたから書籍で出てるやつと違うよということです。

書籍内のやつがこれで、

f:id:nanoyatsu:20200726051144p:plain
更新されたやつがこれです。
f:id:nanoyatsu:20200726051302p:plain

Elm toolingのほうを使いましょう。
古い方のDescriptionを見たらガッツリ「非推奨なったで」って書いてあるんですけどね。

それ以外はまあぶっちゃけそんなに言うことはありません。

CHAPTER 02終了までで「100ページを超えている」と言いましたが、
CHAPTER 01は合計12ページとかなので・・・。

ちなみに書籍内ではnpm install -gをしていました。僕はしました。

CHAPTER 02 elmを書くためのはなし

で、こっちが本題です。80ページくらいある。
文法とか思想とか「型を使うんやで」とかデータ構造とかの話です。
ぼくは思いました。「やっててよかったF#!」

いくらかピックアップして書こうと思います。

文法のはなし

値と演算子の話から関数適用とナントカ式の奴らとリスト・タプル・レコードの記法まで。
全体的にHaskellを感じました。1日か2日くらいかけて数ミリつまんだ程度なんですけど。

let式

個人的には構文としてのlet式が初見だったので、アツく感じました。
(スコープを切るためだけの構文のことです -> Elm文法総復習 let-in式 - Qiita
(リンク先を見るにHaskellには搭載されているらしいので、早速「数ミリ」に含まれなかった様子)

自分はKotlinくんのスコープ関数を思い出して理解に役立てたわけですが、
それよりもシンプルで目的が明白且つ便利だと思われます。やっててよかったKotlin!(早速F#どっかいった)

レコード型

それから、レコード型にJavaScriptを感じております。
僕自身が「やっててよかったJavaScript」と言えない身分にあるので、このへん正しく把握するのが今後大変そうだなあと思っております。
とりあえず今のところは(Javaの)クラスを起こしたい時はこれになるんだろうと思ってぼんやりしています。

そのほか

あとはだいたい「やっててよかったF#」でして、
「関数適用がね」とか「リストの書き方がね」とかです。ほんとにこのへんの概念慣れててよかった。

シャドーイングだけF#と反対に「禁止」でした。
「ルールつけてわかりやすくすんぞ」という思想を感じます。

あと、ついにforは存在さえしないんですね。こわ。正直一番衝撃がでかい。

型のはなし

制約つきの型変数

多少大仰な名前なんですけど、とりあえず列挙します。これで全部みたいです。

型変数 性質 型の種類
number 数値計算や比較ができる Int, Float
comparable 比較することができる Int, Float, Char, String, またはそれらを要素に持つリストまたはタプル
appendable 値をつなげることができる String, List a
compappend 値を比較することができ、かつ、つなげることができる String, List a

シグネチャに出てくるこいつら誰か網羅してくれ」とずっと思っていたので超助かりました。

あとまあこうも思いました。「interfaceやんけ」。
(ただし、ユーザー定義のものはまた違う書き方をする様子)

type alias

alias(別名)とか言いながらそれ以上のことをしていました。
暗黙的にコンストラクタっぽいものが生成されるみたいです。たぶんこれは多用するやつです。

パラメータつきのレコード

ここたぶんJS。(わかってない)(構造的部分型というやつ?)
interface的な動きとJSのオブジェクトにダックタイピングする動きを両方得たものと感じています。

これによって型安全も担保している様子です。
つまりすげえ賢いやつ。たぶん。全部たぶんだなこいつ。

カスタム型

「あっ強化版enum!!!」Java型厨並の感想)(KotlinになるとSealed Classで表現の幅が増える)(F#だと判別共用体のはず)(TypeScriptのUnion Typeとは多少違うらしい)

あとあんまり意識していなかったんですが、構文をこう↓書いてあって「たしかに」と思いました。

type 型
  = コンストラクタ 型 型 ...
  | コンストラクタ 型 型 ...
  | コンストラクタ 型 型 ...

それぞれ値を持つ型なんですよね。という「たしかに」でした。

データ構造のはなし

リスト

case list of
  first :: second :: third :: rest -> 
    -- first, second, thirdを使った処理

この書き方良い・・・良くない?
F#でもこの書き方ができたか定かじゃないです。できそうではある。

それだけですね。

そのほか

Maybeとかはいつものやつだったので、「やっててよかった${任意の言語}」みたいなところがありました。なんだそれは。

あと、同じ文脈(書籍)の中でMaybe(Optional)とResultについて同時に説明される経験が無かったので、
「こいつらは似てるけどResultには失敗の原因がついてるで」と説明されたのがわりと助かりました。

おしまい

主に「elmの構文だよ~」というだけの部分を長々とやりましたが、
なんだかんだで学びがありました。ナメてスキップしなくてよかった。

次からは実際にプロジェクトを起こしていきます。
そしてTEAをやります。(思い出される過去の様子

そいではまた。