我正在尝试使用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
中提到的类型相同。