我一直在尝试使用pipe-attoparsec,但运气不好。
似乎Void和X之间存在类型不匹配(似乎是)相对简单的代码。从我在库中读到的内容(这将是某种类型的同义词),我不确定如何解释类型错误。
测试代码:
{-# LANGUAGE OverloadedStrings,RankNTypes #-}
module Main where
import qualified Data.Attoparsec.Char8 as A
import qualified Pipes as P
import qualified Pipes.Attoparsec as PA
import qualified Pipes.ByteString as PB
import qualified Pipes.Parse as PP
passthrough :: A.Parser PB.ByteString
passthrough = A.takeWhile (\s->True)
f :: Monad m => PP.StateT (P.Producer PB.ByteString m r) m (Either String String)
f = do
r <- PA.parse passthrough
return $ case r of
Left e -> Left "a"
Right (_,r1) -> Right "b"
g = PP.evalStateT f PB.stdin
h = P.runEffect g
这会导致错误:
P.hs:16:8:
Couldn't match type `pipes-4.0.2:Pipes.Internal.Proxy
Data.Void.Void () () PB.ByteString m r0'
with `P.Proxy P.X () () PB.ByteString m r'
Expected type: PP.StateT
(PP.Producer PB.ByteString m r)
m
(Either PA.ParsingError (Int, PB.ByteString))
Actual type: PP.StateT
(pipes-4.0.2:Pipes.Core.Producer PB.ByteString m r0)
m
(Either PA.ParsingError (Int, PB.ByteString))
In the return type of a call of `PA.parse'
In a stmt of a 'do' block: r <- PA.parse passthrough
In the expression:
do { r <- PA.parse passthrough;
return
$ case r of {
Left e -> Left "a"
Right (_, r1) -> Right "b" } } Failed, modules loaded: none.
答案 0 :(得分:1)
您需要升级到最新的pipes-attoparsec
,这会将其pipes
依赖关系限制为4.1.*
。如果您列出已为pipes
,pipes-parse
和pipes-attoparsec
安装的版本,我可以为您提供更详细的信息。如果您输入ghc-pkg list | grep pipes
就足够了。
答案 1 :(得分:0)
看起来你正在使用 pipes-4.1.0版本 pipes-attoparsec(或其他pipe- *包,我无法单独从错误消息中确定。)预期 pipes-4.0.2
如果您同时安装了旧版本和最新版本,则很有可能需要使用ghc-pkg hide
隐藏较旧版本的pipes-attoparsec(或其他pipe- *包)。我不得不偶尔用其他软件包来做这件事,但我不清楚cabal / ghci / ghc是如何进入必要状态的。
使用ghc-pkg list | grep pipes-attoparsec
查看已安装的版本并尝试隐藏旧版本。如果您只安装了旧版本,请使用cabal安装来获取新版本。
Void
与X
不匹配来自
从pipes-4.1.0开始
void包。