我一直在嘗試pipe-attoparsec,但一直沒有多少運氣。管道檢測問題-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.
如果他安裝了「pipes-4.0.2」,然後安裝了「pipes-attoparsec」,然後安裝了「pipes-4.1.0」並隱藏了先前版本的管道,就會發生這種情況。只是不要安裝相同包的多個版本。壞事發生。 – Carl
@Carl在一系列cabal install之後,我遇到過這種類型的問題,而且沒有隱藏任何軟件包。在Mac 10.8.5上。 – Davorak