我正在尝试编写一个可以解析下面所有三个电话号码的trifecta解析器。当我尝试parsePhone
通过调用使用parseString parsePhone mempty phoneNum2
时,解析器在第一个破折号处失败并说它是预期'('
的。
当我在 phoneNum1 上调用解析器时,它失败了')'
,说它是预期'('
的。
为什么我的 skipSymbol 解析器失败了?我认为由于我使用了<|>
,解析器不会检测到'('
并继续前进。我尝试的技术skipSymbol
一定会失败吗?
phoneNum1 = "(123) 456 7890"
phoneNum2 = "123-456-7890"
phoneNum3 = "1234567890"
type NumberingPlanArea = Integer
type Exchange = Integer
type LineNumber = Integer
data PhoneNumber =
PhoneNumber NumberingPlanArea
Exchange LineNumber
deriving (Eq, Show)
parse3digits :: Parser Integer
parse3digits = read <$> replicateM 3 digit
skipSymbol :: Parser ()
skipSymbol =
skipMany (char '(')
<|> skipMany (char ')')
<|> skipMany (char '-')
<|> skipMany (char ' ')
parsePhone :: Parser PhoneNumber
parsePhone =
skipSymbol >>
parse3digits >>=
\area -> skipSymbol >>
parse3digits >>=
\exch -> skipSymbol >>
integer >>=
\line ->
pure $ PhoneNumber area exch line