He visto referencias al truco showS
para crear cadenas (por ejemplo, en this discussion), pero nunca he visto una buena descripción de la misma.¿Cuál es el truco de showS en Haskell?
¿Qué es el truco de showS?
He visto referencias al truco showS
para crear cadenas (por ejemplo, en this discussion), pero nunca he visto una buena descripción de la misma.¿Cuál es el truco de showS en Haskell?
¿Qué es el truco de showS?
En la biblioteca estándar, ShowS
se define como:
type ShowS = String -> String
Este es un difference list. El truco es que una cadena xs
se representa como ShowS
por la función que lo antepone a cualquier otra lista: (xs ++)
. Esto permite una concatenación eficiente, evitando los problemas de concatenación asociativa izquierda anidada (es decir, ((as ++ bs) ++ cs) ++ ds
). Por ejemplo:
hello = ("hello" ++)
world = ("world" ++)
-- We can "concatenate" ShowS values simply by composing them:
helloworld = hello . world
-- and turn them into Strings by passing them an empty list:
helloworld' = helloworld ""
Se llama ShowS
porque se usa en la implementación de los estándares Show
clase de tipos para permitir eficiente show
ción de grandes estructuras, están anidadas; así como show
, puede implementar showsPrec
, que tiene el tipo:
showsPrec :: (Show a) => Int -> a -> ShowS
Esto permite la manipulación de precedencia de los operadores, y devuelve un valor ShowS
. Las instancias estándar implementan esto en lugar de show
para mayor eficiencia; show a
se define en términos de ello, como showsPrec 0 a ""
. (Esta definición por defecto se encuentra en la clase de tipos Show
en sí, por lo que sólo puede implementar showsPrec
para una instancia completa.)
Enlace: ShowS está en el módulo Text.Show del paquete base en http://hackage.haskell.org/package/base-4.7.0.2/docs/Text-Show.html –
showS
utiliza el enfoque de lista diferencia para concatenar eficientemente los componentes individuales del valor mostrado. La función toma el valor que se mostrará, y una cadena para anexar al resultado. La cadena anexa se pasa hasta el subvalor situado más a la derecha hasta que alcanza una hoja, donde en realidad se agrega.
Hay una descripción de las listas de diferencia (incluyendo showS
) aquí http://www.haskell.org/haskellwiki/Difference_list
En cuanto a las respuestas aquí, un breve resumen podría ser: el "' truco showS'" es a su vez una ineficiente (' O (n^2) ') la concatenación de cadenas asociada a la izquierda en una concatenación de cadenas asociada a la derecha eficiente (' O (n) ') al convertir las cadenas en continuaciones (preceder) y luego componer las continuaciones. – ntc2