Как я могу разобрать римские цифры в Haskell Parse c? - PullRequest
4 голосов
/ 24 января 2020

Я новичок Haskell, и я пытаюсь узнать о Parse c, написав парсер, который может использовать или арабскую c цифру, например, "234", или римскую, например, "MCMLXIX." Я нашел библиотеку римских цифр , и поэтому я решил, что я попытаюсь как-то использовать функцию fromRoman в сочетании с Parse c, так как в конечном итоге мне понадобится арабский c эквивалент римской цифры. Но я просто пока не знаю, как заставить Maybe вывод fromRoman в Parser. Это то, что у меня есть до сих пор:

import Text.Parsec
import Text.Parsec.Text (Parser)
import Text.Numeral.Roman

arabicNum :: Parser Int
arabicNum = do
  n <- many1 digit
  return (read n)

isChapter :: Inline -> Bool
isChapter str = str == Str "CHAPTER"

number :: Parser Int
number = arabicNum <|> romanNum

romanNum :: Parser Int
romanNum = do
  str <- many1 char
  return case (fromRoman str) of
    Just n -> n
    Nothing -> Nothing

Но, без кости, так как я еще не совсем знаю, что я делаю.

1 Ответ

5 голосов
/ 24 января 2020

Если ваш Maybe равен Nothing, вы можете fail выдать ошибку синтаксического анализатора. Если это что-то, вы можете return это:

romanNum :: Parser Int
romanNum = do
  str <- many1 $ oneOf "MDCLXVI"
  case fromRoman str of
    Just n -> return n
    Nothing -> fail $ str ++ " is not a valid roman numeral"
...