HaskellでCharをStringに変換したい

地味にハマったのでメモ。

やりたいこと

Haskellでは、(1文字だけの)文字を扱うときはChar型、文字列を扱うときはString型を利用する。 Chat型で表記するときはシングルクオーテーション「'」で文字を囲み、 String型で表記するときはダブルクオーテーション「"」で文字列を囲む。

Prelude> 'a'
'a'  ← これは文字(Char)として扱われる
Prelude> "a"
"a"  ← これは文字列(String)として扱われる

基本的には使い分ければ問題ないのだが、例えば文字列(String)を標準出力に表示させるための関数であるputStrLnに文字(Char)を与えると、型エラーとなってしまい表示させることができない*1

Prelude> :t putStrLn
putStrLn :: String -> IO ()
Prelude> putStrLn 'a'

<interactive>:2:10: error:
    • Couldn't match type ‘Char’ with ‘[Char]’
      Expected type: String
        Actual type: Char
    • In the first argument of ‘putStrLn’, namely ‘'a'’
      In the expression: putStrLn 'a'
      In an equation for ‘it’: it = putStrLn 'a'

このようなエラーを回避するため、CharをStringに変換する関数を作成したい。

charToString :: Char -> String

やったこと

charToString :: Char -> String
charToString c = [c]

簡単な説明

Haskellでは、StringはCharのリスト型の別名となっている。
すなわち、String = [Char] として扱うことができる。そのため、1文字でもリストの要素としてしまえば、Stringと同じである[Char]として扱うことができるようになるというわけ。

Prelude> :type 'a'
'a' :: Char
Prelude> :type "a"
"a" :: [Char]
Prelude> :type ['a']
['a'] :: [Char]

*1:1文字を出力するための関数 putChar を使えばよいという話ではあるが