Haskell: i migliori strumenti per convalidare l'input testuale?

1

In Haskell, ci sono alcune diverse opzioni per "analizzare il testo". Conosco Alex e amp; Happy , Parsec e Attoparsec . Probabilmente alcuni altri.

Mi piacerebbe mettere insieme una libreria in cui l'utente può inserire pezzi di un URL (schema ad esempio HTTP, nome host, nome utente, porta, percorso, query, ecc.) Mi piacerebbe convalidare i pezzi in base al ABNF specificato in RFC 3986 .

In altre parole, mi piacerebbe mettere insieme una serie di funzioni come:

validateScheme    :: String -> Bool
validateUsername  :: String -> Bool
validatePassword  :: String -> Bool
validateAuthority :: String -> Bool
validatePath      :: String -> Bool
validateQuery     :: String -> Bool

Qual è lo strumento più appropriato da usare per scrivere queste funzioni?

Le espressioni regolari di Alex sono molto concise, ma sono un tokenizer e non ti permettono in modo diretto di analizzare le regole specifiche, quindi non è esattamente quello che sto cercando, ma forse si può essere indotti a farlo facilmente.

Ho scritto codice Parsec che fa parte di quanto sopra, ma sembra molto diverso dall'ABNF originale e inutilmente lungo.

Quindi, ci deve essere un modo più semplice e / o più appropriato. Raccomandazioni?

    
posta Ana 06.11.2013 - 19:56
fonte

1 risposta

3

Sono curioso del perché Parsec sia stato così lungo, lo scriverei qualcosa come

data URL = URL { scheme, hostname, username, port, path, query :: String}

parser :: String -> Either ParseError URL
parser = flip parse "Foo" $ Parser <$> parseScheme <*> parseHostname <*> parseUsername ...

validators = [validateScheme . scheme, validateHostname . hostname, .....]
validate :: URL -> Bool
validate url = all ($url) validators

Questo è bello e conciso per me. Per quanto riguarda l'implementazione del parser, è semplice analizzare ogni sezione e quindi applicare URL a ogni pezzo.

    
risposta data 06.11.2013 - 20:40
fonte

Leggi altre domande sui tag