Haskell новичок здесь, пытаясь написать код для разбора математических выражений. Код:Возможно ли установить гнезда в Haskell?
isDigit :: Char -> Bool
isDigit c = c >= '0' && c <= '9'
parseNumber :: String -> Maybe (String, String)
parseNumber [] = Just ("", "")
parseNumber (h:ls)
| isDigit h
| p == Nothing = Just([h], ls) -- Digit found <<< ERROR!!
| otherwise = Just (h:fst d, snd d) -- Ends in a digit
| h == '.'
| p == Nothing = Nothing -- Ends in a point
| not ('.' `elem` (snd d)) = Just (h:(fst d), snd d) -- We don't want multiple dots
| otherwise = Nothing -- Not a number, stop looking!
where
p = parseNumber ls
Just d = parseNumber ls -- Float version of p. Not used if p is Nothing
Эта функция должна принимать строку, начинающуюся с номером, и возвращает число, отделенный от остальной части выражения. Пример:
parseNumber "123,0 + 2"
("123,0", "+ 2")
Я думаю, что синтаксис этих вложенных охранников читает очень хорошо, но это не делает Работа. Погрешность для отмеченной строки:
Ошибка синтаксического разбора при вводе `| '
Прицепные ограждения не допускаются в Haskell? Или я так ошибаюсь? Кроме того, какие альтернативы мне нужно для простой логики цепи?
Спасибо, он отлично работает. Мне просто немного легче читать. – SlySherZ