使用ByteString将Type转换为Text?

时间:2017-05-16 11:59:45

标签: haskell

使用conduit,我的私人仓库代码无法编译:

  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 个答案:

答案 0 :(得分:2)

我不太了解conduit,但是从阅读文档中我会尝试以下内容:

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)

使用mapInputencodeUtf8decodeUtf8

这是未经测试的,告诉我它是否适合你! : - )

在ghci中快速测试,它似乎工作。您可能希望对decodeUtf8进行适当的错误处理。

答案 1 :(得分:2)

我建议将decodeUtf8C function与普通融合(@{ Layout = ""; } 运算符)一起使用。如果您的代码如下:

.|

然后你可以把它重写为:

makesText .| needsByteString

如果您想忽略编码错误,也可以选择使用decodeUtf8LenientC