En la mayoría de los lenguajes de OO con los que estoy familiarizado, el método toString
de String
es en realidad solo la función de identidad. Pero en Haskell show
agrega comillas dobles.¿Hay una función polimórfica `toString` que no agregue comillas?
Así que si escribo una función algo como esto
f :: Show a => [a] -> String
f = concat . map show
funciona como se espera para los números
f [0,1,2,3] -- "0123"
pero Cuerdas terminan con citas adicionales
f ["one", "two", "three"] -- "\"one\"\"two\"\"three\""
cuando realmente quiere "onetwothree"
.
Si quería escribir f
polimórfica, hay una manera de hacerlo con sólo una restricción Show
, y sin anular la instancia Show para cuerdas (si eso es posible).
Lo mejor que puedo llegar a es crear mi propia clase de tipo:
class (Show a) => ToString a where
toString = show
y añadir una instancia para todo?
instance ToString String where toString = id
instance ToString Char where toString = pure
instance ToString Int
instance ToString Maybe
...etc
Terminé usando el constructo 'newtype' para crear un [' LiteralString'] (https://github.com/corsis/PortFusion/blob/ad63a006cff324667cca2316699e26a0078fbc02/src/Main.hs#L67) tipo con 'Mostrar personalizado 'y' Lectura' instancias: https://github.com/corsis/PortFusion/blob/ad63a006cff324667cca2316699e26a0078fbc02/src/Main.hs#L67 –
Vea también http://stackoverflow.com/questions/12102874/haskell-suppress-quotes -around-strings-when-shown – sth
Tenga en cuenta que 'Show' no solo agrega comillas dobles. También se escapa de caracteres como saltos de línea. Por ejemplo, la cadena de un carácter '" \ n "' se muestra como una cadena de cuatro caracteres, con los caracteres ", \, n,". – sdcvvc