Объедините два парсера parse c с типами integer и double с новым парсером типа number - PullRequest
0 голосов
/ 26 мая 2020

, поэтому я не могу понять эту проблему:

У меня есть следующий код:

   data Number = NumberInt Integer
                | NumberFloat Double
                deriving(Show, Eq)


   intParser :: Parser Integer
    --code of the parser

   doubleParser :: Parser Double
    --code of the parser

   intOrFloat :: Parser Number
   intOrFloat = -- to do

один из моих подходов заключался в том, чтобы реализовать intOrFloat следующим образом:

intOrFloat :: Parser Number
intOrFloat =
      (do
        e<- doubleParser
        let result = (e :: Number)
        pure result)
      <|>
      (do
        f<- intParser
        let result = (f :: Number)
        pure result

      )

Но я всегда получаю ошибку: не удалось сопоставить ожидаемый тип «Число» с фактическим типом «Целое число»

Не могли бы кто-нибудь объяснить мне, как объединить два парсера для новый парсер с другим типом? Я не понимаю, в чем проблема. Я использую синтаксический анализ c.

Я новичок в Haskell, поэтому будьте осторожны. Спасибо.

1 Ответ

1 голос
/ 26 мая 2020

Вы не можете просто преобразовать значение, чтобы называть его Number; вам необходимо построить новое значение типа Number.

do
    e <- DoubleParser  -- e :: Double, assuming success
    let result = NumberFloat e  -- result :: Number
    pure result

Вышеупомянутое можно просто записать как

NumberFloat <$> DoubleParser

полностью,

intOrFloat :: Parser Number
intOrFloat = NumberFloat <$> doubleParser <|> NumberInt <$> intParser
...