1

现在我正在做我的大学作业,其中一项任务是在我的虚拟编程语言(名为“Hi”)的 Haskell 解析器中添加字符串文字支持。

我用该代码解决了这个任务:

parseString = do
   res <- char '\"' *> manyTill charLiteral (char '\"')
   return (HiValueString (pack res))

但我不明白如何使用between?我想让这个解析器的代码更短,比如:

parseString = do
   res <- between '\"' '\"'
   return (HiValueString (pack res))
4

1 回答 1

2

between将解析器而不是字符作为参数。您需要两个(微不足道的)解析器,每个解析器,'"'以及引号之间的解析器。

parseString = do
    let quoted = between (char '"') (char '"')
    res <- quoted (many charLiteral)
    return (HiValueString (pack res))

并没有更短(甚至忽略了我为了可读性而引入的额外变量绑定),但它可以让您更清晰地将引用与被引用的内容分开。

无论如何,您都<$>可以>>=使用return.

parseString = (HiValueString . pack) <$> (char '"' *> manyTill charLiteral (char '"'))

或者

parseString = (HiValueString . pack) <$> (between (char '"') (char '"') (many charLiteral))
于 2022-01-09T21:28:34.953 回答