HaskellでtoString

* JavaでいうtoString の作り方がわからない
* 異なるクラスで同名のフィールドが定義できない

と書いてあったけども、showはいろんなオブジェクト?にあるよなぁと思って試してみたけどうまく動かなかったのでLingrで聞いたらできた。
http://www.lingr.com/room/haskell_hackathon_2008/archives/2008/01/28#msg-24671377

ソースコード

class ToStringable a where
    toString :: a -> String

data Pair = Pair {car::Pair, cdr::Pair} | Null | Value Int

instance ToStringable Pair where
    toString (Pair x y) = "(" ++ toString x ++ " . " ++ toString y ++ ")"
    toString Null = "()"
    toString (Value x) = show x


main = putStrLn $ toString $ (Pair (Value 1) (Pair (Value 2) Null))
-- (1 . (2 . ()))

全般的に、「型クラス」「型」「データ構築子」の区別が自分の中であいまいであることがわかった。Intは型、NumやShowは型クラス、Pairは型とデータ構築子の両方、NullとValueはデータ構築子。