haskell - 我可以编写 ReadS 和 ReadP 吗?

标签 haskell

我正在尝试用 ReadP 编写一个解析器,我想用 read 来解析数字。但我一定遗漏了一些东西,因为即使是最微不足道的例子也会出现错误:

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

我什至在各处都指定了类型,但它就是行不通。我做错了什么?

最佳答案

你需要用 reads 替换你对 read 的使用:

> (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")]

这绝对不是你想要的。

关于haskell - 我可以编写 ReadS 和 ReadP 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57032938/

相关文章:

haskell - 使用 MVar 实现并发堆栈

Haskell 群函数/第一个元素总是丢失

linux - haskell cabal : Mysterious missing or recursive dependencies

haskell - 理解 (>>=) 。 (>>=)

haskell - Reactive 的 Monad 实例如何处理同时发生的事件?

haskell - 应用 map ,但仅供临时使用

haskell - 仿函数父类(super class)型有冲突的实例

haskell - 用于 Haskell Cabal 的 Ruby Bundler Gemfile/Gemfile.lock 模拟

Haskell:TVar:防止饥饿

haskell - ghc 7.4.1 分支在哪里?