Bagaimana Anda menyatakan pola regex di Haskell?
Saya mencoba melakukan penggantian regex dengan kode berikut
import Text.RE.Replace
import Text.RE.TDFA.String
onlyLetters :: String -> String
onlyLetters s = replaceAll "" $ s *=~ [re|$([^a-zA-Z])|]
Saya merasa sangat sulit untuk menemukan dokumentasi yang dapat dipahami tentang ini. Ini menghasilkan kesalahan kompilasi:
src\Pangram.hs:6:53: error: parse error on input `]'
|
6 | onlyLetters s = replaceAll "" $ (s *=~ [re|[a-zA-Z]|]) | ^ Progress 1/2 -- While building package pangram-2.0.0.12 (scroll up to its section to see the error) using: C:\sr\setup-exe-cache\x86_64-windows\Cabal-simple_Z6RU0evB_3.0.1.0_ghc-8.8.4.exe --builddir=.stack-work\dist\29cc6475 build lib:pangram test:test --ghc-options " -fdiagnostics-color=always" Process exited with code: ExitFailure 1 PS C:\Users\mcleg\Exercism\haskell\pangram> stack test pangram> configure (lib + test) Configuring pangram-2.0.0.12... pangram> build (lib + test) Preprocessing library for pangram-2.0.0.12.. Building library for pangram-2.0.0.12.. [1 of 2] Compiling Pangram src\Pangram.hs:7:56: error: parse error on input `]' | 7 | onlyLetters s = replaceAll "" $ s *=~ [re|$([^a-zA-Z])|]
| ^
Progress 1/2
-- While building package pangram-2.0.0.12 (scroll up to its section to see the error) using:
C:\sr\setup-exe-cache\x86_64-windows\Cabal-simple_Z6RU0evB_3.0.1.0_ghc-8.8.4.exe --builddir=.stack-work\dist\29cc6475 build lib:pangram test:test --ghc-options " -fdiagnostics-color=always"
Process exited with code: ExitFailure 1
Apa masalah dengan braket itu dan bagaimana saya melakukannya dengan benar? Terima kasih -Skye
Jawaban
The […|…|]adalah kutipan kuasi sintaks [Haskell-wiki] . Ini adalah perpanjangan dari sintaks Haskell dan tidak diaktifkan secara default.
Anda dapat mengaktifkannya dengan LANGUAGEpragma:
{-# LANGUAGE QuasiQuotes #-}
import Text.RE.Replace
import Text.RE.TDFA.String
onlyLetters :: String -> String
onlyLetters s = replaceAll "" $ s *=~ [re|$([^a-zA-Z])|]
Quasiquote akan menghasilkan kode Haskell dan ini kemudian digunakan dalam program Haskell. Ini berarti bahwa melalui quasiquote, validasi regex dapat dilakukan pada waktu kompilasi dan bahkan mungkin sedikit mengoptimalkan efisiensi dibandingkan dengan mengompilasi regex pada waktu proses.
Untuk onlyLettersfungsi yang diberikan , kita mendapatkan:
*Main> onlyLetters "fo0b4r"
"fobr"
Jawaban Willem Van Onsem adalah jawaban yang lebih baik untuk pertanyaan tersebut, tetapi saya akan menyarankan jawaban "coba ini saja" .
Ini adalah bagaimana Anda bisa melakukan penggantian teks di Haskell biasa tanpa kerumitan ekspresi reguler.
Dengan https://hackage.haskell.org/package/replace-megaparsec/docs/Replace-Megaparsec.html#v:streamEdit
{-# LANGUAGE TypeFamilies #-}
import Text.Megaparsec
import Text.Megaparsec.Char
import Replace.Megaparsec
import Data.Void
-- | Invert a single-token parser “character class”.
-- | For example, match any single token except a letter or whitespace: `anySingleExcept (letterChar <|> spaceChar)`
anySingleExcept :: (MonadParsec e s m, Token s ~ Char) => m (Token s) -> m (Token s)
anySingleExcept p = notFollowedBy p *> anySingle
-- | A parser monad pattern which matches anything except letters.
nonLetters :: Parsec Void String String
nonLetters = many (anySingleExcept letterChar)
onlyLetters :: String -> String
onlyLetters = streamEdit nonLetters (const "")
onlyLetters "fo0b4r"
"fobr"