基本的なデータ型

このページでは、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 型の値だということです。