1

pipes-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.
4

2 に答える 2

1

最新の にアップグレードする必要があります。これにより、依存関係が にpipes-attoparsec制限されます。、、および にインストールしたバージョンをリストしていただければ、これがどのように発生したかについて、より詳細な情報を提供できます。入力すればそれで十分です。pipes4.1.*pipespipes-parsepipes-attoparsecghc-pkg list | grep pipes

于 2014-02-06T12:35:44.970 に答える