Haskell Разбор рекурсии и возможно - PullRequest
2 голосов
/ 07 января 2020

Я пытаюсь написать синтаксический анализатор в Haskell.

Этот синтаксический анализатор принимает строку (пример: "ab c def") в параметре и возвращает Maybe (String, String).

Maybe (String, String)

Первая строка получает символы, пока она является цифрой или буквой.

Вторая строка получает остальные

В этом примере я хочу вернуть Maybe («ab c», «def»).

parseString :: String -> Maybe (String, String)
parseString "" = Nothing
parseString expr = case isString expr of
                Just (char, rest) -> fmap (char:) (parseString rest)
                Nothing -> Just ("", expr)

isString return:

Maybe (Char, String) -> Char = первый символ, String = rest / Nothing, если это не буква или ди git.

Проблема, я не могу вернуть оставшуюся часть String в возможных.

1 Ответ

3 голосов
/ 07 января 2020

Кажется, проблема в

fmap (char:) (parseString rest)

Теперь (char:) является функцией String -> String, поэтому fmap (char:) становится Maybe String -> Maybe String (или его обобщением для другого функтора). Однако parseString rest - это не Maybe String, а Maybe (String, String).

Итак, нам нужно адаптировать (char:) для работы с первым компонентом этой пары. Я бы попробовал

fmap (\(res,rest2) -> (char:res, rest2)) (parseString rest)

(импортируя first из Data.Bifunctor или Control.Arrow, который можно записать как fmap (first (char:)) (parseString rest), но это не так важно.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...