【发布时间】:2020-01-09 10:16:22
【问题描述】:
我想直接访问 parsecs 输入流,这可以使用 getParserState 完成。要从流中读取,提供了uncons 方法。但是,我(像往常一样)面临与类型相关的问题。所以这是我的解析函数:
myParser :: (Stream s m Char) => ParsecT s (ShiftedState u s) m String
myParser = do
s <- P.getParserState
let i = stateInput s
let x = uncons i
return ""
我收到以下错误。
Could not deduce (Stream s m0 Char)
arising from a use of ‘uncons’
问题只是我不太清楚错误的确切含义。我认为uncons 在底层单子中运行,而不是在 ParsecT 单子中。但我不知道如何解除(?)它。
基本上我想知道如何使用uncons 并从流中读取。现在请不要担心一个应该这样做......这基本上是我理解单子是如何工作的xD
【问题讨论】:
-
发生了什么事:
uncons需要在某种 monad 中运行(看看the definition)。但是你只是在做let x = uncons i——所以x是一个返回uncons结果的单子计算,但是你没有指定哪个单子计算在其中运行。错误只是说,由于您没有指定 monad,它称为m0,GHC 不一定知道 monadm0是否实际上是Stream s m0 Char的实例。 -
(我没有将其发布为答案的原因是因为我还没有解决方案。但我想我现在有一个解决方案 - 我现在重新发布该评论作为答案.)