2012-01-28 39 views
21

De acuerdo con una serie de tutoriales (incluyendo Real World Haskell) uno puede, usando ghci hacer lo siguienteTodos los partidos de expresiones regulares en Haskell

ghci > :m Text.Regex.Posix 
ghci > "foo foo foo" =~ "foo" :: [String] 
["foo","foo","foo"] 

Sin embargo, cuando intento esto, se produce

No instance for (RegexContext Regex [Char] [String]) 
    arising from a use of `=~' 
Possible fix: 
    add an instance declaration for 
    (RegexContext Regex [Char] [String]) 
In the expression: "abc" =~ "ab" :: [String] 
In an equation for `it': it = "abc" =~ "ab" :: [String] 

¿Cuál es la forma correcta de obtener una lista de todas las coincidencias en haskell?

+2

posible duplicado de [ "= ~ "raise" No hay instancia para (RegexContext Regex \ [Char \] \ [String \]) "] (http://stackoverflow.com/questions/7636447/raise-no-instance-for-regexcontext-regex-char- cadena) – ehird

Respuesta

23

Las bibliotecas de expresiones regulares pueden ser algo confuso con sus tipos de retorno sobrecargados, pero para llegar a todos los partidos sólo tiene que asegurarse de que el tipo de retorno es AllTextMatches, por ejemplo:

Prelude> :m + Text.Regex.Posix 
Prelude Text.Regex.Posix> getAllTextMatches $ "foo foo foo" =~ "foo" :: [String] 
["foo","foo","foo"] 
+0

Bueno, eso funciona. Gracias. ¿Tienes alguna idea de por qué esto no parece ser mencionado en los tutoriales? – archgoon

+8

La interfaz de expresiones regulares se actualizó desde que salió RWH. – ehird

+0

@ehird ¿Dónde podría encontrar una referencia actualizada? – ApproachingDarknessFish

Cuestiones relacionadas