2010-09-05 2 views
8
getMultiWordPortion :: String -> String 
getMultiWordPortion (x:':':xs) = xs 
getMultiWordPortion _ = "" 

Il risultato atteso dalla corrispondenza del modello in questo codice è che tutto prima che i primi due punti vengano assegnati a x, e che in seguito viene assegnato a xs, che è il risultato. Se non ci sono due punti, non viene restituito nulla.Haskell Pattern Matching su stringhe - Perché non funziona?

Ciò che effettivamente accade con una stringa di esempio che sto usando ("PING: gibson.freenode.net" - fa parte di un client IRC) è che ottengo il valore di ritorno vuoto.

Cosa sto facendo di sbagliato qui?

+0

Forse, questo aiuterà: http://stackoverflow.com/questions/1602243/pattern-matching-string-prefixes-in-haskell –

+1

FWIW, linguaggi logici (ad esempio Prolog, Curry) sono quelli che possono fare questo tipo di abbinamento di modelli. È piuttosto bello quando è disponibile tutta la potenza dei pattern (non da prendere come critica a Haskell) – luqui

risposta

16

Il motivo x:':':xs significa "Il primo carattere è x, il secondo carattere è ':' i caratteri rimanenti sono nell'elenco xs". Questo significa che il tipo di x è Char, non [Char] e che il modello corrisponde solo se c'è esattamente un carattere prima dei due punti.

Non c'è modo di utilizzare la corrispondenza dei modelli negli elenchi per dire "corrisponde a una sottolista, seguita da un elemento, seguita dall'elenco rimanente".

Per ottenere la sottostringa dopo i primi due punti è possibile utilizzare dropWhile (/= ':') theString. Questo includerà i due punti, quindi usa tail o pattern matching per rimuoverlo.

+1

Oppure, se usi View Patterns, puoi essere un vero pantalone di fantasia: – BMeph

4

L'operatore : dispone di un elemento in testa a un elenco. Il tuo pattern corrisponderà solo a una stringa in cui i due punti sono il secondo elemento nell'elenco.