我可以撰写ReadS和ReadP吗?

时间:2019-07-15 03:28:53

标签: haskell

我正在尝试使用ReadP组成一个解析器,并且我想使用read来解析数字。但是我必须错过一些东西,因为即使是最琐碎的例子也会出现错误:

λ import Text.ParserCombinators.ReadP
λ (readP_to_S . readS_to_P $ (read :: ReadS Int)) "123" :: [(Int, String)]
*** Exception: Prelude.read: no parse

我什至在所有地方都指定了类型,但是那根本行不通。我在做什么错了?

1 个答案:

答案 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")]

这绝对不是您想要的。