Haskell
- 4 ответа
- 0 вопросов
2
Вклад в тег
It is doubtful that the structuring methods presented here would have been discovered without the insight afforded by category theory. But once discovered they are easily expressed without any reference to things categorical. No knowledge of category theory is required to read these notes.
Вряд ли методы структурирования, описанные здесь, могли бы быть найдены без тех возможностей, которые нам предоставила теория категорий. Но после того, как они были найдены, они легко описываются без какого-либо упоминания теории категорий. Знания теории категорий не требуется для того, чтобы понять эту статью.
data Token = NumToken Double | OpToken Operator | LeftParenToken | RightParenToken
data Operator = Plus | Minus | Mult | Div
strToToken :: String -> [Token]
strToToken [] = []
strToToken (c:cs)
-- Токенизируем голову списка и вызываем токенизацию на его хвосте
| c == '(' = LeftParenToken : strToToken cs
| c == ')' = RightParenToken : strToToken cs
-- Если встречается пробел - откидываем его и токенизируем строку дальше
| isSpace c = strToToken cs
-- если встречается число, вызываем функцию-хелпер number
| isDigit c = number c cs
-- не забываем о случаях, когда строку не удалось распарсить полностью
| otherwise = error $ "Не могу распарсить " ++ [c]
number :: Char -> String -> [Token]
number c cs =
-- разбиваем строку на цифровые символы, идущие друг за другом,
-- и на остаток строки при помощи функции span
let (digits,rest) = span isDigit cs
-- сразу переводим полученные цифровые символы в число
-- при помощи функции read и токенизируем остаток строки
in NumToken (read $ c:digits) : strToToken rest