2017-05-16 8 views
0

conduitを使用して、私のプライベートレポコードがコンパイルに失敗します。ByteStringでテキストをテキストに変換しますか?

Expected type: ConduitM 
        Text Void (Control.Monad.Trans.Resource.Internal.ResourceT IO)() 
    Actual type: ConduitM 
        ByteString 
        Void 
        (Control.Monad.Trans.Resource.Internal.ResourceT IO) 
        () 

どのように関数を定義することができますか?

type Helper a = ConduitM a Void (Control.Monad.Trans.Resource.Internal.ResourceT IO() 

f :: Helper ByteString -> Helper Text 

答えて

2

decodeUtf8C functionと通常の融合(.|演算子)を併用することをおすすめします。あなたのコードがどのように見える場合:

makesText .| needsByteString 

次に、あなたのようにそれを書き換えることができます:

makesText .| decodeUtf8C .| needsByteString 

また、あなたがエンコードのエラーを無視する場合decodeUtf8LenientCを使用するように選択することができます。

2

私は十分にうまくconduitを知らないが、ドキュメントを読んでから、私はの線に沿って何かをしようとするだろう:これはテストされていないmapInputencodeUtf8decodeUtf8

を使用して

import Data.Void   (Void) 
import Data.Text   (Text) 
import Data.Text.Encoding (encodeUtf8, decodeUtf8) 
import Data.ByteString (ByteString) 
import Data.Conduit 

type Helper a = ConduitM a Void (Control.Monad.Trans.Resource.Internal.ResourceT IO)() 

f :: Helper ByteString -> Helper Text 
f = mapInput encodeUtf8 (pure . decodeUtf8) 

をそれがあなたのために働くかどうか教えてください! :-)

ghciですぐにテストしたところ、うまくいくようです。あなたはdecodeUtf8のためのいくつかの適切なエラー処理をしたいかもしれません。

+0

'mapInput decodeUtf8(pure。encodeUtf8)'であってはなりませんか? – epsilonhalbe

+0

それは理にかなっています!あなたの提案で編集し、OPからのフィードバックを待ちます: –

+0

@epsilonhalbe、実際には 'mapInput'の型から、それは交換される必要があります。私はたぶん自分でそれをほとんど知っていないときにコンジットについての物に答えるべきではないでしょう:/ –

関連する問題