基本的なデータ型
このページでは,Haskell で利用できる基本的なデータ型について紹介します.
1. データ型の紹介
このページで紹介するデータ型は,次の表に示すデータ型です.
型 | 説明 | 値の例 |
---|---|---|
|
論理型 |
|
|
固定長整数型 |
|
|
多倍長整数型 |
|
|
単精度浮動小数点数型 |
|
|
倍精度浮動小数点数型 |
|
|
文字型 |
|
|
文字列型 |
|
|
タプル型 |
|
|
ユニット型 |
|
|
リスト型 |
|
|
Maybe 型 |
|
2. 論理型
論理型 Bool
のリテラルは True
と False
です.
論理演算子には次のようなものがあります.
関数 | 説明 |
---|---|
|
否定 |
|
論理積 |
|
論理和 |
not True -- 値: False
True && False -- 値: False
True || False -- 値: True
代表的な関係演算子には次のようなものがあります.
演算子 ==
および /=
は,値の等価性を調べます.
(Haskell では,参照の等価性は扱いません.)
関数 | 説明 |
---|---|
x == y | 等値 |
x /= y | 非等値 |
x > y | 大なり |
x < y | 小なり |
x >= y | 以上 |
x <= y | 以下 |
2 == 3 -- 値: False
2 /= 3 -- 値: True
2 > 3 -- 値: False
2 <= 3 -- 値: True
3. 数値型
Haskell の数値型には,主に次のようなものがあります.
分類 | 型 | 説明 |
---|---|---|
整数型 |
|
固定長整数型 |
|
多倍長整数型 |
|
浮動小数点数型 |
|
単精度浮動小数点数型 |
|
倍精度浮動小数点数型 |
次のようなリテラルが使えます.
123 -- 10 進表記(Int, Integer, Float, Double)
0o12, 0O12 -- 8 進表記(Int, Integer, Float, Double)
0x1a, 0X1A -- 16 進表記(Int, Integer, Float, Double)
3.14 -- 普通の小数点表記(Float, Double)
1.23e4, 5.67E-8 -- 指数表記(Float, Double)
数値型に適用できる主な関数には,主に次のようなものがあります.
関数 | 説明 | 整数型に 使える |
浮動小数点数 型に使える |
---|---|---|---|
|
単項マイナス |
✓ |
✓ |
|
|
✓ |
✓ |
|
絶対値 |
✓ |
✓ |
|
加算 |
✓ |
✓ |
|
減算 |
✓ |
✓ |
|
|
✓ |
✓ |
|
乗算 |
✓ |
✓ |
|
除算 |
✓ |
|
|
除算(-∞ 方向に丸め) |
✓ |
|
|
除算(ゼロ方向に丸め) |
✓ |
|
|
剰余(div の余り) |
✓ |
|
|
剰余(quot の余り) |
✓ |
|
5.0 / 2.0 -- 値: 2.5
7 `div` (-3) -- 値: -3
7 `quot` (-3) -- 値: -2
7 `mod` (-3) -- 値: -2
7 `rem` (-3) -- 値: 1
累乗関数として次のようなものが利用できます. 基数と指数の型によって 3 つのバリエーションがあります.
累乗関数 | x の型,結果の型 | y の型 |
---|---|---|
|
Int, Integer, Float, Double |
Int, Integer |
|
Float, Double |
Int, Integer |
|
Float, Double |
Float, Double |
2 ^ 8 -- 値: 256
2.0 ^ 8 -- 値: 256.0
2.0 ^^ 8 -- 値: 256.0
2.0 ** 8.0 -- 値: 256.0
4. 文字型
Haskell の文字型 Char
の値は,Unicode 文字を表します.
リテラルは 'a'
のように,シングルクォートを用いて書きます.
文字リテラルには,次に示すようなエスケープシーケンスが利用できます (表は主なもの).
ES (例) | 説明 |
---|---|
|
ラインフィード |
|
キャリッジリターン |
|
水平タブ |
|
制御文字 ^X(Ctrl-X) |
|
制御文字 LF |
|
文字コード 92(10 進) |
|
文字コード 134(8 進) |
|
文字コード 5C(16 進) |
5. 文字列型
文字列型の型名は String
で,リテラルは "hello"
のようにダブルクォートを用いて書きます.
エスケープシーケンスには,文字リテラルと同様のものが利用できます.
"" -- 空文字列
"hello" -- 文字列 "hello"
実は,文字列の実体は文字のリストであり,String
は [Char]
の別名に過ぎません.
文字列リテラル "hello"
は文字のリスト ['h', 'e', 'l', 'l', 'o']
を表します.
そのため,文字列にはリストと同じ関数を使うことができます.
length "hello" -- 値: 5
"abc" ++ "def" -- 値: "abcdef"
6. タプル型
タプル(tuple)は,順序付きの値の組を表します.
リテラルは (値1, …, 値n)
の形式で書き, 型も (型1, …, 型n)
の形式で書きます.
(123, 'a') -- (Int, Char) 型
(123, 456) -- (Int, Int) 型
(True, 123, "abc") -- (Bool, Int, [Char]) 型
Haskell には,要素数 1 のタプルは存在しません.
例えば (123)
という式はただの Int
の式であり,タプルではありません.
要素数がちょうど 2 のタプル には,fst
と snd
という関数が特別に用意されています.
fst(123, 456) -- 値: 123 (第 1 要素を返す)
snd (123, 456) -- 値: 456 (第 2 要素を返す)
7. ユニット型
要素数 0 のタプルは特にユニット(unit)と呼ばれます.
リテラルは ()
と書き,型も同じく ()
と書きます.
ユニットは,特に意味のある値がない状況で使われる値です.
手続き型言語の void
と似たような使われ方をします.
8. リスト型
リスト(list)は,同じ型の要素を一方向に連結したデータ構造です.
リテラルは [値1, …, 値n]
形式で書き,型は単に [要素型]
のように書きます.
要素数 0 のリスト(空リスト)のリテラルは []
と書きます.
[] -- [a] 型 (空リスト)
[1, 2, 3] -- [Int] 型
['a', 'b', 'c'] -- [Char] 型
"abc" -- [Char] 型
[[1, 2], [3], []] -- [[Int]] 型
リストを扱う代表的な関数として,次のようなものがあります.
head [1, 2, 3] -- 値: 1 (先頭要素を返す)
tail [1, 2, 3] -- 値: [2, 3] (先頭要素を除いたリストを返す)
[1] ++ [2, 3] -- 値: [1, 2, 3] (リストを連結する)
[1, 2, 3] !! 0 -- 値: 1 (先頭から n 番目の要素を返す)
length [1, 2, 3] -- 値: 3 (リストの長さを返す)
リストについての詳細については "リスト" のページで扱います.
9. Maybe 型
Maybe
型は,値が存在しないかもしれない状況で使われるデータ型です.
Maybe
型の値には,次の 2 種類があります.
値 | 説明 |
---|---|
|
値は存在しない |
|
値 |
具体的な値の例は以下の通りです.
Nothing -- Maybe a 型
Just 5 -- Maybe Int 型
Just [1, 2, 3] -- Maybe [Int] 型
誤解を恐れずにいうと,Maybe 型は C# のヌル許容型みたいなやつです.
重要な違いは,C# の null は本当に値がないのに対し,Haskell の Nothing はあくまで Maybe 型の値だということです.
|
Maybe 型の値から中の値を取り出すには,パターンマッチングを利用します. パターンマッチングについては "式と宣言" のページで扱います.