我正在尝试使用ReadP
组成一个解析器,并且我想使用read
来解析数字。但是我必须错过一些东西,因为即使是最琐碎的例子也会出现错误:
λ import Text.ParserCombinators.ReadP
λ (readP_to_S . readS_to_P $ (read :: ReadS Int)) "123" :: [(Int, String)]
*** Exception: Prelude.read: no parse
我什至在所有地方都指定了类型,但是那根本行不通。我在做什么错了?
答案 0 :(得分:4)
您需要将read
的使用替换为reads
:
> (readP_to_S . readS_to_P $ (reads :: ReadS Int)) "123" :: [(Int, String)]
^^^^^
[(123,"")]
不幸的是,它使用read
进行了类型检查,但这是因为read
的类型签名是如此普遍。实际上,解析器read :: ReadS Int
试图解析整数和字符串的元组列表!
> (read :: ReadS Int) "[(1,\"hi\"),(2,\"bye\")]"
[(1,"hi"),(2,"bye")]
这绝对不是您想要的。