我无法找到一个函数或变通方法来转换一个字符串到Data.ByteString.Lazy.Internal.ByteString
Aeson Json库中的一个功能是decode并具有以下描述:
decode :: FromJSON a => bytestring-0.10.0.2:Data.ByteString.Lazy.Internal.ByteString -> Maybe a
Run Code Online (Sandbox Code Playgroud)
我已尝试在Data.ByteString.Lazy.Char8中使用pack函数,但返回不同的ByteString.任何人都知道如何解决这个问题?
以下是我正在研究的例子:
import Data.Aeson
import Data.Text
import Control.Applicative
import Control.Monad (mzero)
import qualified Data.ByteString.Lazy.Internal as BLI
import qualified Data.ByteString.Lazy.Char8 as BSL
data Person = Person
{ name :: Text
, age :: Int
} deriving Show
instance FromJSON Person where
parseJSON (Object v) = Person <$>
v .: (pack "name") <*>
v .: (pack "age")
parseJSON _ = mzero
Run Code Online (Sandbox Code Playgroud)
我尝试使用decode (BSL.pack "{\"name\":\"Joe\",\"age\":12}") :: Maybe Person
并收到以下错误消息:
Couldn't match expected type `bytestring-0.10.0.2:Data.ByteString.Lazy.Internal.ByteString'
with actual type `BSL.ByteString'
In the return type of a call of `BSL.pack'
In the first argument of `decode', namely
`(BSL.pack "{\"name\":\"Joe\",\"age\":12}")'
In the expression:
decode (BSL.pack "{\"name\":\"Joe\",\"age\":12}") :: Maybe Person
Run Code Online (Sandbox Code Playgroud)
救命!
您需要使用c2w将Char转换为Word8(在Data.ByteString.Internal中)
Data.ByteString.Lazy.pack $ map c2w "abcd"
Run Code Online (Sandbox Code Playgroud)
我写了包的完全限定名称也保证使用正确的名称,但你可以在导入部分清理它.我跑的时候
> :t Data.ByteString.Lazy.pack $ map c2w "abcd"
Run Code Online (Sandbox Code Playgroud)
我得到":: Data.ByteString.Lazy.Internal.ByteString"
请记住,Data.ByteString.Lazy表示数字值的字符串(你甚至不能在字符串上运行它的包,你需要提供一个数字数组"pack [1,2,3,4]"),所以你可能实际上想要使用char等效的Data.ByteString.Lazy.Char8.
| 归档时间: |
|
| 查看次数: |
1495 次 |
| 最近记录: |