Elmのお勉強2: 型
Elm前回
型について
型推論があり、型を指定しなくても自動で指定する。
プリミティブ
- 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 のクライアントアプリを作りました。 | ヌーラボ