In den meisten OO-Sprachen, mit denen ich vertraut bin, ist die toString
-Methode eines String
tatsächlich nur die Identitätsfunktion. Aber in Haskell fügt show
doppelte Anführungszeichen hinzu.
Also, wenn ich eine Funktion wie diese schreibe
f :: Show a => [a] -> String
f = concat . map show
funktioniert es wie erwartet für Zahlen
f [0,1,2,3] -- "0123"
aber Strings enden mit zusätzlichen Anführungszeichen
f ["one", "two", "three"] -- "\"one\"\"two\"\"three\""
wenn ich eigentlich "onetwothree"
möchte.
Wenn ich f
polymorphisch schreiben wollte, gibt es eine Möglichkeit, dies nur mit einer Show
-Einschränkung und ohne Überschreiben der Show-Instanz für String zu tun (wenn das überhaupt möglich ist).
Das Beste, was mir einfällt, ist, meine eigene Typklasse zu erstellen:
class (Show a) => ToString a where
toString = show
und eine Instanz für alles hinzufügen?
instance ToString String where toString = id
instance ToString Char where toString = pure
instance ToString Int
instance ToString Maybe
...etc