2010-09-25 14 views
8

W Haskell, w celu reprezentowania dosłowne ciąg "\", jeden normalnie napisać:Haskell - Czy literalne ukośniki odwrotne zawsze muszą być ujęte w ciąg znaków?

"\\" 

jednak, czy jest jakiś sposób na ucieczkę ciąg taki, że pojedynczy backslash mogą być napisane samodzielnie, bez konieczności być uciekł? Na przykład, można zrobić dokładnie to w C# przez wstawienie @ do napisu:

@"\" 

Czy Haskell mają równoważną?

+0

potrójnie cytując \ w Pythonie nie działa tak ... – geoffspear

Odpowiedz

5

Nie, patrz sekcja 2.6 z Haskell Lexical Structure.

Haskell nie ma surowych łańcuchów, heredoc lub potrójnych łańcuchów. Przepraszam. Jedynym fanciness masz to:

"ab\ 
    \cd" 

=> 

"abcd" 

Biała przestrzeń między kończących wiersz i -beginning ukośniki są ignorowane. Jest to użyteczne, na przykład, jeśli chcesz emitować jakiś wbudowany kod HTML, który jest właściwie wcięty w źródle Haskella, ale nie jest zbytnio wcięty w wynik. (Nie, że bym opowiadają robi skomplikowane wyjście HTML w ten sposób.)

+0

i musiałbym powiedzieć, ukośniki odstępu-ignorując wydają trochę mi nie pasuje, co z haskellem jest dość łatwe do stania. – muhmuhten

+0

Użyłem tej funkcji raz, nie pamiętam dlaczego. Nie było jednak emitowanie HTML. –

+0

idealnie, kompilator byłby w stanie określić "" bla "++" bla "w czasie kompilacji w czystym kodzie. w rzeczywistości nie mam pojęcia. – muhmuhten

1

Jest to możliwe przy użyciu standardowych Haskell, dzięki mechanizmowi QuasiQuoting:

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

ten sposób, no \\ już problem. Jedynym problemem jest to, że teraz musisz uważać na |], który kończy quasiquotingową sekwencję i że możesz uciec. W kontekście wyrażeń regularnych uniknąłem tego używając \ u7c] lub czegoś podobnego, nie pamiętam dokładnie. Więc użyłem kodu Unicode lub ASCII dla znaku potoku. Ale ta sekwencja | nie pojawia się często.

A jeśli jesteś zainteresowany tym, aby wprowadzić wyrażeń regularnych, jestem wielkim fanem biblioteki Rex:

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

który wykorzystuje nie tylko quasiquoting na ładnym wejściem regex (brak podwójnych backslashe), używa również wyrażeń regularnych podobnych do perla, a nie domyślnych irytujących wyrażeń regularnych POSIX, a nawet pozwala używać wyrażeń regularnych jako wzorca dopasowującego parametry metody, co jest genialne.

1

Jest miły library (raw-strings-qq) co daje 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>|] 
Powiązane problemy