Program > JavaScript > AltJS > Elm > Elmガイド > 言語の基礎
言語の基礎 †
- 言語の基礎 · An Introduction to Elm https://guide.elm-lang.jp/core_language.html
REPLを使って実際に手を動かしながら読み進めていくと理解しやすいので、インストールが終わったらターミナルでelm replを実行してみてください。
ElmのREPLを使って、文法の基礎を確認していきましょう。
Windowsならコマンドプロンプトで
elm repl
と入力します。
値 †
文字列 †
- 文字リテラルは「"」(ダブルクオーテーション)で囲む。
- 文字の連結は「++」という演算子を使う。
「+」じゃなくて「++」という別の演算子を用意しているところが良いですね!
- 「+」は数値用
- 「++」は文字用
という割り切りがある?
数値 †
JavaScriptとは異なり、Elmは整数と浮動小数点数を区別します。
ちょうどPython 3と同じように、浮動小数点数の除算(/)と整数の除算(//)の両方が別々に存在します。
- 「/」は整数の割算用
- 「//」は浮動小数点の割算用
関数 †
ElmはHaskellっぽい書き方をする、と理解しておけば良いでしょうか?
書式
関数名 引数 = 関数の本体
例
isNegative n = n < 0
無名関数 †
Haskellのラムダ式と同じですね。
ラムダ(λ)の代わりに、バックスラッシュ(¥)を使います。
書式
\引数 -> 関数の本体
例
> \n -> n < 0 <function> > (\n -> n < 0) 4 False
条件分岐 †
if式の書式
> if True then "hello" else "world" "hello" > if False then "hello" else "world" "world"
Haskellのifではelseを省略できません。
Elmも同様にifでelseを省略できません。
REPLでif式を書いてthen部分までしか書かないでリターンキーを押すと、続きを入力する状態になります。=続きのelseを求められている?
(参考)
- Elmの関数型的側面の多分ていねいな解説 - Qiita https://qiita.com/A_kirisaki/items/8fa5563a035c8c4d977c
elseは省略できません。
- 構文のほとんどが式でとってもシンプルなプログラミング言語Elm - Qiita https://qiita.com/ababup1192/items/ed93f4a76ba184ddab7f
Elmでは実行時エラーが原則起きません。これは分岐漏れをコンパイラが許さない制約を持つからです。つまりifを書いた際にはelseを省略することができません。
データ構造 †
普通のプログラミング言語にあるデータ構造(配列など)は、Elmにも用意されています。
リスト †
リストは複数の値を持つことができますが、それらの値はすべて同じ型を持っていなければなりません。
- リストの書式
「[」と「]」で括り、「,」で要素を区切る
- リストの例
> names = [ "Alice", "Bob", "Chuck" ] > numbers = [1,4,3,2]
タプル †
タプルは固定された個数の値を保持することができ、それらの値の型はそれぞれ別々にすることができます。
典型的な使いかたとしては、関数からふたつ以上の値を返す必要があるときです。
- タプルの書式
「(」と「)」で括り、「,」で要素を区切る
- タプルの例
(True, "name accepted!")
レコード †
Elmのレコードは連想配列ですね。
レコードは任意個のフィールドを持っていて、それぞれのフィールドに値を格納したり、フィールドから値を取り出すことができます。
ただしElmのレコードのフィールドは固定されていて、レコードに動的にフィールドを付け加えたり取り除いたりすることはできません。
- レコードの書式
「{」と「}」で括り、「,」で要素を区切る 各要素は、「フィールド名=データ」という形になっている
- レコードの例
> point = { x = 3, y = 4 } > bill = { name = "Gates", age = 62 } > bill.name "Gates"
レコードとオブジェクトの比較 †
Elmのレコードには、いくつかの特徴、注意点があります。
ElmのレコードはJavaScriptのオブジェクトと似ていますが、いくつか重要な違いもあります。レコードには次のような特徴があります。
- 存在しないフィールドにアクセスすることはできません。
- フィールドが undefined や null になることもありません。
- this や self キーワードを使って再帰的なレコードを作ることはできません。
Elmには破壊的な再代入がない †
Elmのデータ構造は破壊的な再代入はできない、とのこと。
参照透過性を維持する関数型言語なら普通のことですね。
この構文ではレコードの破壊的な更新をしているのではないことに注意してください。
billのフィールドを更新したとき、実際には既存のレコードを上書きしているのではなく、新たなレコードが作成されています。
効率のため、Elmは新しいレコードの内容を古いレコードとなるべく共有しようとします。
つまり10個のフィールドのうちひとつを更新したとしたら、残り9個の変更されていないフィールドはコピーされるのではなく、新しいレコードと古いレコードで共有される形になります。
(参考)
- constと副作用とワイ - Qiita https://qiita.com/Yametaro/items/2b7edb45d3ca8f916d44
ワイ「Elmではそもそも再代入する術がないんか」
ワイ「もう再代入やなくて名前の衝突やねんな」
ワイ「再代入いう概念がないねんな」