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

El resultado esperado de la coincidencia de patrones en este código es que todo antes de los primeros dos puntos se asigna a x, y todo se asigna a xs, que es el resultado. Si no hay dos puntos, no se devuelve nada.Haskell Pattern Matching en cadenas - ¿Por qué esto no funciona?

Lo que realmente ocurre con una cadena de muestra que estoy usando ("PING: gibson.freenode.net" - es parte de un cliente de IRC) es que obtengo el valor de retorno en blanco.

¿Qué estoy haciendo mal aquí?

+0

Tal vez, esto ayude: http://stackoverflow.com/questions/1602243/pattern-matching-string-prefixes-in-haskell –

+1

FWIW, los lenguajes lógicos (por ejemplo, Prolog, Curry) son los que pueden hacer este tipo de coincidencia de patrón. Es muy bueno cuando todo el poder de los patrones está disponible (no debe tomarse como una crítica de Haskell) – luqui

Respuesta

16

El patrón x:':':xs significa "El primer carácter es x, el segundo carácter es ':' los caracteres restantes están en la lista xs". Esto significa que el tipo de x es Char, no [Char] y que el patrón solo coincide si hay exactamente un carácter antes de los dos puntos.

No hay forma de utilizar la coincidencia de patrones en las listas para decir "coincida con una sublista, seguido de un elemento, seguido de la lista restante".

Para obtener la subcadena después del primer punto, puede usar dropWhile (/= ':') theString. Esto incluirá los dos puntos, así que use tail o coincidencia de patrón para eliminarlo.

+1

O, si utilizas Ver patrones, puedes ser un verdadero fancy-pants: – BMeph

4

El operador : conside un elemento al principio de una lista. Su patrón solo coincidirá con una cadena donde los dos puntos son el segundo elemento de la lista.

Cuestiones relacionadas