2012-02-08 12 views
24

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?

+4

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

Respuesta

40

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.)

+1

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 –

8

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

Cuestiones relacionadas