2010-09-25 37 views
8

En Haskell, con el fin de representar la cadena literal "\", que normalmente se escribe:Haskell: ¿Las barras invertidas literales siempre deben escaparse en una cuerda?

"\\" 

Sin embargo, hay una manera de escapar de la cadena de tal manera que una sola barra invertida se puede escribir por sí mismo sin necesidad de estar ¿escapado? Por ejemplo, puedo hacer exactamente esto en C# mediante pre-pendiente @ a la cadena:

@"\" 

¿Se Haskell tienen un equivalente?

+0

triple citando a un \ en Python no funciona así ... – geoffspear

Respuesta

5

No, consulte la sección 2.6 de Haskell Lexical Structure.

Haskell no tiene cadenas sin formato, heredos o cadenas triples. Lo siento. La única fanciness que se obtiene es la siguiente:

"ab\ 
    \cd" 

=> 

"abcd" 

espacio en blanco entre la línea interminable y barras -empezando se ignora. Esto es útil, por ejemplo, si desea emitir algún código HTML en línea que esté apropiadamente sangrado en la fuente Haskell, pero no excesivamente sangrado en la salida. (No es que yo abogo haciendo complicada la salida HTML de esta manera.)

+0

y yo tendría que decir, las barras invertidas por espacios en blanco parecen ignorar un poco de maldad para mí, con Haskell siendo bastante fácil de doblar constantemente. – muhmuhten

+0

Utilicé la función una vez, no recuerdo por qué. Sin embargo, no fue para emitir HTML. –

+0

idealmente, el compilador sería capaz de determinar '" blah "++" blah "' en tiempo de compilación en código puro. en realidad, no tengo idea. – muhmuhten

1

Es posible usar Haskell estándar, gracias al mecanismo QuasiQuoting:

http://www.haskell.org/haskellwiki/Poor_man%27s_here_document#Quasiquoting

De esa manera, sin \\ problema más. El único problema es que ahora debes tener cuidado con el |] que termina la secuencia de cuasiquoting y que puede que tengas que escapar. En el contexto de las expresiones regulares, me escapé usando \ u7c] o algo así, no recuerdo exactamente. Así que utilicé el código Unicode o ASCII para el personaje de la tubería. Pero esta |] secuencia no aparece a menudo.

Y si usted está interesado en esta opción para introducir expresiones regulares, soy un gran fan de la biblioteca Rex:

http://hackage.haskell.org/package/rex

cual no sólo utiliza quasiquoting de entrada agradable expresiones regulares (no hay barras invertidas dobles), también usa expresiones regulares semejantes a Perl y no las molestas expresiones regulares POSIX molestas, e incluso le permite usar expresiones regulares como patrones que coincidan con los parámetros de su método, lo cual es genio.

1

Hay una bonita library (raw-strings-qq) que le da QuasiQouter

import Text.RawString.QQ 

multiline :: String 
multiline = [r|<HTML> 
<HEAD> 
<TITLE>Auto-generated html formated source</TITLE> 
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1252"> 
</HEAD> 
<BODY LINK="800080" BGCOLOR="#ffffff"> 
<P> </P> 
<PRE>|] 
Cuestiones relacionadas