gpt4 book ai didi

parsing - 如何使用 Parsec 仅在某个范围内解析一串整数?

转载 作者:行者123 更新时间:2023-12-04 02:09:12 27 4
gpt4 key购买 nike

我正在尝试通过解析格式为“YYYYMMDD”的日期字符串来学习秒差距,例如“20161030”。我的解决方案是:

date :: Parser (String, String, String)
date = do
year <- replicateM 4 digit
month <- replicateM 2 digit
day <- replicateM 2 digit
return (year, month, day)

但问题是“20161356”也是我代码的有效日期。

如何验证“MM”在 1 到 12 之间; “DD”在 1 到 31 之间?

最佳答案

您可以添加 guard正如 Thomas M. DuBuisson 所建议的那样:

date :: Parser (String, String, String)
date = do
year <- replicateM 4 digit
month <- replicateM 2 digit
day <- replicateM 2 digit
guard $ read month > 0 && read month <= 12 && read day > 0 && read day <= 31
return (year, month, day)

但是,这会导致出现错误消息:

λ> parse date "" "20161356"
Left (line 1, column 9):unknown parse error

我们可以通过结合 guard 来解决这个问题与 <?>提供更好的错误消息:

date :: Parser (String, String, String)
date = do
year <- replicateM 4 digit
month <- replicateM 2 digit
guard (read month > 0 && read month <= 12) <?> "valid month (1–12)"
day <- replicateM 2 digit
guard (read day > 0 && read day <= 31) <?> "valid day (1–31)"
return (year, month, day)

使用这种方法,您会得到更有用的错误消息:

λ> parse date "" "20161356"
Left (line 1, column 7):
expecting valid month (1–12)

作为旁注,我认为在解析器中验证(或至少完整性检查)日期有值(value)的——它确保日期验证与解析器的其余部分和错误相结合- 处理代码。您不能忘记稍后在代码中检查日期,并且错误已正确定位,如果您正在解析包含大量日期的文档,这将非常有用。

关于parsing - 如何使用 Parsec 仅在某个范围内解析一串整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40362182/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com