In den meisten OO-Sprachen, die ich kenne, ist die toString
Methode von String
eigentlich nur die Identitätsfunktion. Aber in Haskell show
fügt doppelte Anführungszeichen hinzu.Gibt es eine polymorphe toString-Funktion, die keine Anführungszeichen hinzufügt?
Also, wenn ich eine Funktion schreiben, so etwas wie dies
f :: Show a => [a] -> String
f = concat . map show
es für Zahlen
f [0,1,2,3] -- "0123"
aber Strings am Ende mit zusätzlichen Anführungszeichen wie erwartet funktioniert
f ["one", "two", "three"] -- "\"one\"\"two\"\"three\""
wenn ich wirklich wollen "onetwothree"
.
Wenn ich polymorph schreiben wollte f
, gibt es eine Möglichkeit, es mit nur einer Show
Einschränkung zu tun, und ohne die Show-Instanz für String überschreiben (wenn das überhaupt möglich ist).
Das Beste, was ich mit oben kommen kann, ist meine eigene Art Klasse 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
Ich endete mit dem 'newtype' Konstrukt, um einen [' LiteralString'] (https://github.com/corsis/PortFusion/blob/ad63a006cff324667cca2316699e26a0078fbc02/src/Main.hs#L67) Typ mit benutzerdefinierten 'Show 'und' Read'-Instanzen: https://github.com/corsis/PortFusion/blob/ad63a006cff324667cca2316699e26a0078fbc02/src/Main.hs#L67 –
Siehe auch http://stackoverflow.com/questions/12102874/haskell-suppress-quotes -around-strings-when-show – sth
Beachten Sie, dass 'Show' nicht nur doppelte Anführungszeichen enthält. Es entgeht auch Zeichen wie Zeilenumbrüche. Zum Beispiel wird die Ein-Zeichen-Zeichenkette "\ n" 'als eine Vier-Zeichen-Zeichenkette mit den Zeichen", \, n, "angezeigt. – sdcvvc