基本的なデータ型

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

1. データ型の紹介

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

説明 値の例

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

2. 論理型

論理型 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

3. 数値型

Haskell の数値型には,主に次のようなものがあります.

分類 説明

整数型

Int

固定長整数型

Integer

多倍長整数型

浮動小数点数型

Float

単精度浮動小数点数型

Double

倍精度浮動小数点数型

次のようなリテラルが使えます.

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

4. 文字型

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

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

ES (例) 説明

\n

ラインフィード

\r

キャリッジリターン

\t

水平タブ

\^X

制御文字 ^X(Ctrl-X)

\LF

制御文字 LF

\92

文字コード 92(10 進)

\o134

文字コード 134(8 進)

\x5C

文字コード 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 のタプル には,fstsnd という関数が特別に用意されています.

fst123, 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

値は存在しない

Just x

x が存在する

具体的な値の例は以下の通りです.

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

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