ProgramJavaScriptAltJSElmElmガイド > 言語の基礎

言語の基礎

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にも用意されています。

リスト

リストは複数の値を持つことができますが、それらの値はすべて同じ型を持っていなければなりません。

タプル

タプルは固定された個数の値を保持することができ、それらの値の型はそれぞれ別々にすることができます。
典型的な使いかたとしては、関数からふたつ以上の値を返す必要があるときです。

レコード

Elmのレコードは連想配列ですね。

レコードは任意個のフィールドを持っていて、それぞれのフィールドに値を格納したり、フィールドから値を取り出すことができます。
ただしElmのレコードのフィールドは固定されていて、レコードに動的にフィールドを付け加えたり取り除いたりすることはできません。

レコードとオブジェクトの比較

Elmのレコードには、いくつかの特徴、注意点があります。

ElmのレコードはJavaScriptのオブジェクトと似ていますが、いくつか重要な違いもあります。レコードには次のような特徴があります。

  • 存在しないフィールドにアクセスすることはできません。
  • フィールドが undefined や null になることもありません。
  • this や self キーワードを使って再帰的なレコードを作ることはできません。

Elmには破壊的な再代入がない

Elmのデータ構造は破壊的な再代入はできない、とのこと。
参照透過性を維持する関数型言語なら普通のことですね。

この構文ではレコードの破壊的な更新をしているのではないことに注意してください。
billのフィールドを更新したとき、実際には既存のレコードを上書きしているのではなく、新たなレコードが作成されています。
効率のため、Elmは新しいレコードの内容を古いレコードとなるべく共有しようとします。
つまり10個のフィールドのうちひとつを更新したとしたら、残り9個の変更されていないフィールドはコピーされるのではなく、新しいレコードと古いレコードで共有される形になります。

(参考)

ワイ「Elmではそもそも再代入する術がないんか」
ワイ「もう再代入やなくて名前の衝突やねんな」
ワイ「再代入いう概念がないねんな」


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-11-09 (土) 10:01:42