基本的なデータ型

このページでは,Haskell で利用できる基本的なデータ型について紹介します.

データ型の紹介

このページで紹介するデータ型は,次の表に示すデータ型です.

説明 値の例
Bool 論理型 True, False
Int 固定長整数型 123, 0o12, 0x1a
Integer 多倍長整数型 123, 0o12, 0x1a
Float 単精度浮動小数点数型 123, 0o12, 0x1a, 3.14, 1.23E-10
Double 倍精度浮動小数点数型 123, 0o12, 0x1a, 3.14, 1.23E-10
Char 文字型 ‘a’, ‘\n’
String 文字列型 “abc\n”
(a1, …, an) タプル型 (123, ‘a’)
() ユニット型 ()
[a] リスト型 [1,2,3]
Maybe a Maybe 型 Just 5, Nothing

これらのデータ型について,順番に見ていきましょう.

論理型

論理型 Bool のリテラルは TrueFalse です.

論理演算子には次のようなものがあります.

関数 説明
not x 否定
x && y 論理積
x || y 論理和
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

数値型

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)

数値型に適用できる主な関数には,主に次のようなものがあります.

関数 説明 整数型に
使える
浮動小数点数
型に使える
-x 単項マイナス
negate x -x に同じ
abs x 絶対値
x + y 加算
x - y 減算
subtract x y y - x に同じ
x * y 乗算
x / y 除算
x `div` y 除算 (-∞ 方向に丸め)
x `quot` y 除算 (ゼロ方向に丸め)
x `mod` y 剰余 (div の余り)
x `rem` y 剰余 (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 の型
x ^ y Int, Integer, Float, Double Int, Integer
x ^^ y Float, Double Int, Integer
x ** y Float, Double Float, Double
2 ^ 8       -- 値: 256
2.0 ^ 8     -- 値: 256.0
2.0 ^^ 8    -- 値: 256.0
2.0 ** 8.0  -- 値: 256.0

文字型

Haskell の文字型 Char の値は,Unicode 文字を表します. リテラルは 'a' のように,シングルクォートを用いて書きます.

文字リテラルには,次に示すようなエスケープシーケンスが利用できます(表は主なもの).

ES(例) 説明
\n ラインフィード
\r キャリッジリターン
\t 水平タブ
\^X 制御文字 ^X (Ctrl-X)
\LF 制御文字 LF
\92 文字コード 92 (10 進)
\o134 文字コード 134 (8 進)
\x5C 文字コード 5C (16 進)

文字列型

文字列型の型名は String で,リテラルは "hello" のようにダブルクォートを用いて書きます. エスケープシーケンスには,文字リテラルと同様のものが利用できます.

文字列の実体は文字のリストであり,String[Char] の別名に過ぎません. 文字列リテラル "hello" は文字のリスト ['h', 'e', 'l', 'l', 'o'] を表します. (リストはこの後すぐ紹介します.)

""               -- 空文字列
"hello"
length "hello"   -- 値: 5
"abc" ++ "def"   -- 値: "abcdef"

タプル型

タプル (tuple) は,順序付きの値の組を表します. リテラルは (123, 'a') などと書き, 型は (Int, Char) のように書きます.

(123, 'a')          -- (Int, Char) 型
(123, 456)          -- (Int, Int) 型
(True, 123, "abc")  -- (Bool, Int, [Char]) 型

Haskell には,要素数 1 のタプルは存在しません.

(123)               -- ただの Int 型 (タプルでない)

要素数がちょうど 2 のタプル には,fstsnd という関数が特別に用意されています.

fst (123, 456)   -- 値: 123  (第 1 要素を返す)
snd (123, 456)   -- 値: 456  (第 2 要素を返す)

ユニット型

要素数 0 のタプルは特にユニット (unit) と呼ばれ,意味のある値がないことを表します. ユニット型は () と書き,リテラルも同じく () と書きます. 手続き型言語の void と似たような使われ方をします.

()     -- () 型

リスト型

リスト (list) は,同じ型の要素を一方向に連結したデータ構造です.

リテラルは [1, 2, 3], ['a', 'b', 'c'] のように書きます. 要素数 0 のリスト(空リスト)は [] と書きます. リストの型は,要素の型が a であれば [a] と書きます.

[]                 -- [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          (リストの長さを返す)

リストについての詳細は「リスト」で扱います.

Maybe 型

Maybe 型は,値が存在しないかもしれない状況で使われるデータ型です.

Maybe 型の値は,値が存在しないことを表す Nothing と,普通の値を表す Just xx は任意の値)です.

Nothing     -- Maybe a 型
Just 5      -- Maybe Int 型
[1, 2, 3]   -- Maybe [Int] 型

Maybe 型の値から中の値を取り出すには,パターンマッチングを利用します. パターンマッチングについては「式と宣言」のページで扱います.

誤解を恐れずにいうと,Maybe 型は C# のヌル許容型みたいなやつです. 重要な違いは,C# の null は本当に値がないのに対し,Haskell の Nothing はあくまで Maybe 型の値だということです.