Вот особенно дерзкий способ продолжить:
parseCommaSepQuotedWords :: String -> [String]
parseCommaSepQuotedWords s = read ("[" ++ s ++ "]")
Это может работать, но это очень хрупкая и довольно глупо. По сути, вы используете тот факт, что Haskell способ записи списков строк почти совпадает с вашим путем, и, следовательно, встроенный экземпляр Read
- это почти вещь, которую вы хотите. Вы можете использовать reads
для лучшей отчетности об ошибках, но на самом деле вы, вероятно, захотите сделать что-то еще.
В общем, parsec
является действительно стоит взглянуть на - это радость для использования, и одна из вещей, которые первоначально действительно получил меня взволнованный о Haskell. Но если вы хотите получить доморощенные решения, я часто пишу простые вещи, используя операторы case
на результат span
и break
. Предположим, что вы ищете следующую точку с запятой на входе.Тогда break (== ';') inp
вернется (before, after)
, где:
before
является содержание inp
до (и не включая) первую точку с запятой (или все это, если его нет)
after
является остаток строки :
- если
after
не пусто, то первый элемент является точкой с запятой
- независимо от того, что еще происходит,
before ++ after == inp
Так разобрать список операторов, разделенных точкой с запятой, я мог бы сделать это:
parseStmts :: String -> Maybe [Stmt]
parseStmts inp = case break (== ';') inp of
(before, _ : after) -> -- ...
--^before is the first statement
-- ^ignore the semicolon
-- ^after is the rest of the string
(_, []) -> -- inp doesn't contain any semicolons
[SPLIT] (http://hackage.haskell.org/package/split), вероятно, будет полезно. Или вы можете использовать настоящие парсеры, такие как [parsec] (http://hackage.haskell.org/package/parsec). –
Похоже, что слова разделяются запятыми * и * кавычками? –
@BenMillwood Слова окружены кавычками и разделены запятыми. –