Как проверить, является ли строка числом в Haskell?

Есть такой код на Haskell:

import Data.Char

isAtom :: String -> Bool
isAtom word = all isAlpha word

token :: String -> String
token word 
    | word `elem` ["+", "-", "/", "*", "%"] = "operator"
    | word == "(" = "lbracket"
    | word == ")" = "rbracket"
    | (c1 == '"') && (c2 == '"') = "string"
    | isAtom word = "atom"
    where
        c1 = head word
        c2 = last word


Вообще это должен быть интерпретатор лиспоподобных арифметических выражений. Собственно, все типы лексем распознавать научился, кроме чисел. Пока в голову приходят два варианта, оба не нравятся: либо пытаться применить read word :: Float и ловить исключение, либо перебирать все символы строки и проверять, являются ли они цифрами. Второй вариант был бы хорош, если бы не дробные числа -- можно было бы написать просто all isDigit word. Может есть какой-нибудь более простой и очевидный способ это сделать?

P. S. На выходе программа должна интерпретировать выражения вида (+ 1 (* 5 4 (/ 4 2)) 3). Уже написал такое на Python, теперь просто переписываю то же на Haskell, чтобы немного набить руку перед тем как писать полноценный интерпретатор по "Write your Scheme in 48 hours"
  • Вопрос задан
  • 1050 просмотров
Решения вопроса 1
Используйте readMaybe из Text.Read
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы