コンパイラかく語りき

import { Fun } from 'programming'

"魅惑のElm標準ライブラリ"を読んだ

Qiitaのこちらの記事を読みました。

qiita.com

 

Elmで定義されているデータ型とその内部実装について、解説がなされています。

以下、読みながらのメモとなります。

 

直和型

基礎知識としまして、Elmにおいて直和型は以下の様にctorフィールドを持つObjectとして表現されます。

ヤバイ。直和型もctorも初めて聞いた。分からない…。

 

調べた↓

qiita.com

enumC言語の構造体の、両方の性質を持ってるもの”といった具合。なるほど。

ちなみに、ctorはコンストラクタのことみたいです。ググったらすぐヒットしました。

 

elmでは、直和型を以下のように表現します。

gist28836583ef6a41148673e7d2fbbae3e6

 

なるほど。。たしかに、構造体の列挙だ。

 

コンパイル後のJavaScriptは以下のようになります。

gistf212045b2cf97cb90def93156f079c3f

分かりやすい!コンストラクタとメンバ変数?が定義されるわけですね。 

 

コンテナ

コンテナという概念があるようですね。

コンテナは以下のデータ構造を含みます。

 

List

List。Elm-Architectureのチュートリアルでも登場しましたね。

もちろんListはHaskellと同様に1方向のLinked-Listとして実装されています

javascriptでの表現は以下の様になります。

empty = {ctor: "[]"} // []
elm1 = {ctor: "::", _0: 1, {ctor: "[]"}} // [1]
elm2 = {ctor: "::", _0: 1, _1: {ctor: "::", _0: 2, {ctor: "[]"}}}

コード例すごい。要素が1つ増えるごとにネストが深くなっていくんですね。再帰的です。

 

Array

Listではランダムアクセスに最悪O(n)時間掛ってしまいますので、ランダムアクセスを多用する時はArrayを使用しましょう。

なるほど。

 

他にも、DictやらSetやらがありますが、割愛します。

おかげさまで、Elmに対する理解が少し深まりました。