Haskellの基本の基本 注意したいところ
Haskell における文字列の正体はリストです。
この事実に注意すると、一重引用符と二重引用符の違いというテーマがとても重要です。
しかし、Haskell初心者にとってはこの重要性を実感できず、あまり注目できない可能性があります。
この記事では、
- 一重引用符と二重引用符の違い
- コンス(
:
演算子) - 文字 (
Char
)と文字列 (String
) - 糖衣構文(シンタックスシュガー)
という観点から、Haskell の文字列とリストについて初心者向けに解説します。
1. 一重引用符 ('
) と二重引用符 ("
) の違い
Haskell では、 一重引用符 ('
) は Char
を表し、二重引用符 ("
) は String
を表します。
例:
c :: Char
c = 'a' -- 一重引用符で囲まれた単一の文字
s :: String
s = "hello" -- 二重引用符で囲まれた文字列(リスト型)
ポイント:
-
'a'
はChar
型(単一の文字) -
"hello"
はString
型([Char]
、つまりChar
のリスト)
文字列は [Char]
(文字のリスト) であるため、リストとしての操作が可能です。
head "hello" -- 'h'
tail "hello" -- "ello"
2. コンス :
演算子
Haskell では、リストの 先頭に要素を追加する演算子として :
(コンス)を使用 します。これは、文字列([Char]
)にも適用できます。
例:
s1 = 'h' : "ello" -- "hello"
s2 = 'H' : "askell" -- "Haskell"
リストとしての解釈:
'h' : ('e' : ('l' : ('l' : ('o' : [])))) -- "hello"
つまり、
-
:
は リストの先頭に要素を追加する演算子 -
"hello"
は実際には'h' : 'e' : 'l' : 'l' : 'o' : []
というリスト構造
3. Char
(文字)と String
(文字列)
Char
は 単一の文字 を表し、String
は Char
のリスト([Char]
) です。
c :: Char
c = 'A' -- 単一の文字
s :: String
s = "Hello" -- 文字のリスト
文字と文字列の区別に注意!
notChar = "A" -- エラー! `"A"` は `Char` ではなく `String`
-
"A"
はString
([Char]
)なので、Char
型の変数には代入できません。 -
String
は実際には['A']
という リスト です。
リスト操作の適用例
length "Haskell" -- 7 (リストの要素数を取得)
reverse "abc" -- "cba" (リストの逆順)
"Hello" ++ " World" -- "Hello World" (リストの結合)
4. 糖衣構文(シンタックスシュガー)
Haskell では、String
に対して便利な書き方(糖衣構文)が提供されています。
String
のリスト表現
実際には、"hello"
は以下のようにリストとして表現されます。
"hello" == ['h', 'e', 'l', 'l', 'o']
このように、String
は Char
のリスト [Char]
の糖衣構文(簡略記法)です。
リスト内包表記と String
Haskell ではリスト内包表記を使って、文字列を生成できます。
alphabet = [c | c <- ['a'..'z']] -- "abcdefghijklmnopqrstuvwxyz"
これは ['a'..'z']
をそのまま String
として扱う例です。
5. まとめ
観点 | 説明 | 例 |
---|---|---|
一重引用符 (' ) |
Char (単一の文字)を表す |
'a' |
二重引用符 (" ) |
String (文字のリスト [Char] )を表す |
"hello" |
コンス (: ) 演算子 |
Char を String に追加できる |
'H' : "askell" → "Haskell"
|
Char と String の違い |
Char は単一の文字、String は [Char]
|
'A' と "A" (['A'] )は異なる |
糖衣構文 |
"hello" は [Char] の省略形 |
"hello" == ['h','e','l','l','o'] |
Haskell では 文字列はリストである という点を理解すると、リスト操作をそのまま String
に適用できるようになります。