Haskell 中的 readP 在使用字符串时具有与预期输入不匹配的输出



我正在尝试使用readP在Haskell中编写一个简单的解析器,并遵循我发现的一些预制代码示例。

我使用如下:

import Text.ParserCombinators.ReadP
import Control.Applicative ((<|>))
t :: ReadP Int
t = (do string "0"
return 0)
<|>
(do string "1"
return 1)
parseString = readP_to_S (t >> eof)

但是我得到以下输出:

ghci> parseString "1"
[((),"")]
ghci> parseString "0"
[((),"")]
ghci> parseString ""
[]

而我期望下面的输出

ghci> parseString "1"
[("1","")]
ghci> parseString "0"
[("0","")]
ghci> parseString ""
[]

怎么会这样呢?有没有办法让它打印这些输出呢?

新代码更好了,但是这里仍然有一个问题

parseString input = runParser (e >> eof) input
--^^^^^^^^^^--

添加>> eof将丢弃e的结果。要保留它,可以使用

parseString input = runParser (e <* eof) input

或者,用更基本的方法:

whole :: Parser Int
whole = do
val <- e       -- save the value produced by e
eof            -- ensure the end of the parsed string
return val     -- return the saved value
parseString input = runParser whole input
在这两种情况下,我们得到:
> parseString "1"
[(1,"")]

注意列表中配对的第一个组件是1,Int。事实上,它与签名whole :: Parser Int中提到的类型相同。

相关内容

  • 没有找到相关文章

最新更新