2009-06-09 18 views
8

El muestran función en Haskell no parece hacer lo que se debe:Haskell: ¿Es un desastre?

Prelude> let str = "stack\n\noverflow" 
Prelude> putStrLn str 
stack 


overflow 
Prelude> show str 
"\"Stack\\n\\n\\noverflow\"" 
Prelude> 

Cuando Declaro funciones, puesto que normalmente las firmas de tipos como Muestra, que no se ocupa correctamente con las nuevas líneas . Quiero que trate \n como nuevas líneas, no literalmente "\n". Cuando cambio el tipo a String, las funciones funcionan bien. Pero tendría que implementar una función separada para los números enteros, flotadores, etc, etc.

Por ejemplo, puede declarar una función:

foo :: (Show x) => x -> IO() 
foo x = do 
    putStrLn $ show x 

... y lo llaman de esta manera:

foo "stack\n\noverflow" 
foo 6 
foo [1..] 

¿Cómo obtendré la función para devolver lo que se espera? Es decir. ¿Qué función es similar a show pero puede devolver cadenas que contienen nuevas líneas?

+1

Puede darnos un caso de uso específico de esta? Haría que entender tu intención sea más fácil. – Martijn

+0

Puede simplemente agregar un cheque para ver si la entrada es una cadena, y simplemente imprimirlo. La coincidencia de patrones es una cosa muy útil. – Rayne

+1

"mostrar" es como 'repr()' en Python y 'inspeccionar' en Ruby, si ya has usado esos idiomas. –

Respuesta

14

El contrato del método de espectáculo en Haskell es que produce una cadena que, cuando se evalúa, arroja el valor que se muestra.

Prelude> let str = "stack\n\noverflow" 
Prelude> putStrLn str 
stack 

overflow 
Prelude> putStrLn (show str) 
"stack\n\noverflow" 
Prelude> 
+2

Solo para agregar a esto, la función que describió se llama "imprimir", que en realidad se define como la anterior imprimir x = putStrLn (mostrar x) – Phyx

3

show muestra la variable en la forma en que la ingresó.

Me parece bastante normal.

9

suena como si estuviera tratando de simular un método ToString, aunque algo de su terminología es un poco confuso.

Puede simular así:

{-# LANGUAGE UndecidableInstances, OverlappingInstances, 
      FlexibleInstances, TypeSynonymInstances #-} 

class ToString a where 
    toString :: a -> String 

instance ToString String where 
    toString = id 

instance Show a => ToString a where 
    toString = show 

Sin embargo, como muestran los pragmas idioma, esto no es muy deseable. Para realmente tener una idea de lo que está tratando de hacer, sería más fácil si tuviéramos más contexto ...

1

No estoy seguro del punto en lo que intenta hacer. Ayudaría si aclaras un poco. Show está haciendo lo que se supone que debe hacer. Show simplemente produce una cadena que contiene lo que se mostró.

1

El plan de Porges funciona y creo que saca a relucir lo que realmente hace el show, ya que el comportamiento confuso que encontraste en ghci seguirá apareciendo si obtienes la función IO que deseas. Tenga en cuenta que agregué una instancia para el código de Char a Porges, ya que supuestamente querría que no tuviera comillas.

{-# LANGUAGE UndecidableInstances, OverlappingInstances, 
     FlexibleInstances, TypeSynonymInstances #-} 
class ToString a where 
    toString :: a -> String 

instance ToString String where 
    toString = id 

instance ToString Char where 
    toString x = [x] 

instance Show a => ToString a where 
    toString = show 

foo :: (ToString a) => a -> IO() 
foo x = do {putStrLn $ toString x} 

entonces, en ghci, ver lo que sucede con foo.show: "¿qué función es similar a show pero puede volver cadenas que contiene saltos de línea"

*Main> let str = "stack\n\noverflow" 
*Main> show str 
"\"stack\\n\\noverflow\""  
*Main> putStrLn str 
stack 

overflow 
*Main> putStrLn (show str) 
"stack\n\noverflow" 
*Main> foo str 
stack 

overflow 
*Main> foo (show str) 
"stack\n\noverflow" 
*Main> foo (show (show str)) 
"\"stack\\n\\noverflow\"" 
*Main> let newl = "\n" 
*Main> foo newl 


*Main> putStrLn newl 


*Main> putStrLn (show newl) 
"\n" 



*Main> foo (show newl) 
"\n" 
*Main> foo (show (show newl)) 
"\"\\n\"" 
*Main> 
0

Respuesta: id

+0

¿Está tratando de ser ¿Es gracioso o acabas de leer la pregunta? – Jasper

+0

Esto es bastante antiguo, pero quizás mattiast significa 'putStrLn $ id" stack \ n \ noverflow "' que responde la pregunta. – stites

Cuestiones relacionadas