地味にハマったのでメモ。
やりたいこと
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 を使えばよいという話ではあるが