Elmのお勉強2: 型

Elm

前回

Elmのお勉強1: 基本

型について

型推論があり、型を指定しなくても自動で指定する。

プリミティブ

  • Int 型 ... 数字
  • Float 型 ... 浮動小数点数
  • Number 型 ... Int と Float になる
  • Char 型 ... 1 文字。シングルクォーテーションで囲む
  • String 型 ... 文字列。ダブルクォーテーションで囲む
  • Bool 型 ... True、False

コレクション

  • List 型 ... リスト。 [1,2,3]なら Number の入った List 型
  • Tuple ... タプル。 (1,2,'3')なら Number、Number1、Char の入った Tuple 型
  • Records ... レコード。myRecord = { style = "Blue" }なら、myRecord.style は String 型
> 3
3 : number
> 'a'
'a' : Char
> "hoge"
"hoge" : String
> 'h'
'h' : Char
> [1,2,3]
[1,2,3] : List number
> myRecords = { style = "Blue" }
{ style = "Blue" } : { style : String }
> myRecords.style
"Blue" : String

型注釈、型定義

型注釈は、変数: 型の名前で記述。

user : String -- userはString型
user = "太郎"

関数の返り値の型は -> で繋ぐ。
関数が全て 1 つの引数を取ること、左結合なのを考えるとなんとなく読めるようになる。

concat : String -> String -> String -- 引数1と2、返り値がString
concat x y =
    x ++ y -- String xとString yを結合

既存の型を使って新しい型を作る時は、型エイリアスを使用する。
下記は Name 型を定義して、中には String 型が入るようにしている。

type alias Name = String -- 型エイリアス

user: Name -- userはName型、つまり文字列が入る
user = "太郎"

type を使って、独自の型も定義できる。
type で作れる型に、直積型やユニオン型というのがある。

直積型

type Data = Data Int Int -- Data構造体を定義

data1 : Data -- data1はData型
data1 = Data 10 20 -- data1にはData 10 20が入る

ユニオン型

type Food = Rice | Bread -- Food型を定義
breakfast: Food -- Foodには、RiceかBreadが入る
breakfast = Rice -- Bread派もいる

コンストラクタ

エイリアスにレコード型を指定する。
以下サンプルは"Player Int 型 String 型"のような形で使用できる。

type alias Info =
{
name : String, -- nameはString
age : Int -- ageはInt
}

user = Info "太郎" 18 -- user.nameに"太郎"、user.ageに18が入る

型変数

ジェネリック。
変数として、その都度型を指定することもできる。

type Age a = Age a -- aは型変数

tarouAge : Age Int
tarouAge = Age 20 -- Int

takashiAge : Age String
takashiAge = Age "不明" -- String

ユニット型

void。
空のタプルを記述する。

foo : () -> ()
foo x =
    x

チュートリアルでは、タスク型(非同期処理)において"Task error result"の引数 error や result を () にすることで、どちらかだけ受け取ったり両方とも受け取らないようなことが書いてあった。

続く。

参考

Elmのチュートリアル
プログラミング言語Elmの薄い本
Elm 言語 が楽しすぎたので Typetalk のクライアントアプリを作りました。 | ヌーラボ