Ответ 1
ghci> getAllTextMatches ("foo" =~ "o" :: AllTextMatches [] String)
["o", "o"]
Я не использовал регулярные выражения в Haskell много (что я думаю ответ Дэн Бертон более идиоматичен).
Итак, как я понял это, я посмотрел на вашу ошибку типа No instance for (RegexContext Regex [Char] [String])
и выскочил в ghci:
ghci> :t (=~)
(=~)
:: (RegexMaker Regex CompOption ExecOption source,
RegexContext Regex source1 target) =>
source1 -> source -> target
Итак, RegexContext Regex [Char] [String]
- это класс, который включает возвращаемый тип "foo" =~ "o" :: [String]
. Поэтому я посмотрел, какие экземпляры этого класса существуют, поэтому я мог бы узнать, каково должно быть возвращаемое значение:
ghci> :i RegexContext
class RegexLike
regex source => RegexContext regex source target where
match :: regex -> source -> target
matchM :: Monad m => regex -> source -> m target
-- Defined in Text.Regex.Base.RegexLike
instance RegexContext Regex String String
-- Defined in Text.Regex.Posix.String
instance RegexLike a b => RegexContext a b [[b]]
-- Defined in Text.Regex.Base.Context
...
instance RegexLike a b => RegexContext a b (AllTextMatches [] b)
-- Defined in Text.Regex.Base.Context
...
Имя AllTextMatches
, казалось, указывало, что вы искали, поэтому я проверил это:
ghci> :i AllTextMatches
newtype AllTextMatches f b
= AllTextMatches {getAllTextMatches :: f b}
-- Defined in Text.Regex.Base.RegexLike
instance RegexLike a b => RegexContext a b (AllTextMatches [] b)
-- Defined in Text.Regex.Base.Context
Таким образом, этот тип использовался для извлечения всех совпадений текста, как я подозревал. Все, что мне нужно было сделать, это указать, что я хотел получить возвращаемое значение этого типа.
Обратите также внимание на возможный тип возвращаемого значения [[b]]
, который, как я полагаю, возвращает список списков, содержащих каждое полное совпадение и все его подматрицы:
ghci> "foo" =~ "o" :: [[String]]
[["o"],["o"]]
ghci> "foo bar baz" =~ "[aeiou](.)" :: [[String]]
[["oo","o"],["ar","r"],["az","z"]]
Итак, возможно, тип, который вы хотели использовать, вместо [String]
. Я мог видеть [String]
как слегка неоднозначную, когда существовал [[String]]
- должен "foo bar baz" =~ "[aeiou](.)" :: [String]
быть fst ("foo bar baz" =~ "[aeiou](.)" :: [[String]])
или map fst ("foo bar baz" =~ "[aeiou](.)" :: [[String]])
.