(如果我应该说UTF8而不是Unicode,很抱歉.)
我已经遇到了this question个人,但几分钟后就想不通了.
这个问题的出发点和我的问题如下
import Data.Aeson
import qualified Data.Text.Encoding as E (encodeUtf8)
import qualified Data.ByteString.Lazy.Char8 as C8 (pack)
import qualified Data.Text as T (pack)
main :: IO ()
main = do
print (foo "{ \"foo\": \"bar\"}" :: Maybe Value)
print (foo "{ \"foo\": \"bòz\"}" :: Maybe Value)
where
foo = decode . C8.pack
将打印
Just (Object (fromList [("foo",String "bar")]))
Nothing
答案和 comments 都提到了利用Data.Text.Encoding
中的encodeUtf8
的解决方案.但如何做到呢?
-
C8.pack
等于String -> ByteString
, -
E.encodeUtf8
等于Text -> ByteString
, -
"{ \"foo\": \"bòz\"}"
等于String
,
所以我想,如果我想用E.encodeUtf8
,我需要go 掉C8.pack
,作为类型为String -> Text
的函数,而T.pack
似乎就是这样一个函数.然而,以下几点:
import Data.Aeson
import qualified Data.Text.Encoding as E (encodeUtf8)
import qualified Data.ByteString.Lazy.Char8 as C8 (pack)
import qualified Data.Text as T (pack)
main :: IO ()
main = do
print (foo "{ \"foo\": \"bar\"}" :: Maybe Value)
print (foo "{ \"foo\": \"bòz\"}" :: Maybe Value)
where
foo = decode . E.encodeUtf8 . T.pack
编译失败,出现错误
• Couldn't match type ‘bytestring-0.11.5.3:Data.ByteString.Internal.Type.ByteString’
with ‘Data.ByteString.Lazy.Internal.ByteString’
Expected: Data.Text.Internal.Text
-> Data.ByteString.Lazy.Internal.ByteString
Actual: Data.Text.Internal.Text
-> bytestring-0.11.5.3:Data.ByteString.Internal.Type.ByteString
NB: ‘Data.ByteString.Lazy.Internal.ByteString’
is defined in ‘Data.ByteString.Lazy.Internal’
‘bytestring-0.11.5.3:Data.ByteString.Internal.Type.ByteString’
is defined in ‘Data.ByteString.Internal.Type’
• In the first argument of ‘(.)’, namely ‘E.encodeUtf8’
In the second argument of ‘(.)’, namely ‘E.encodeUtf8 . T.pack’
In the expression: decode . E.encodeUtf8 . T.pack
|
11 | foo = decode . E.encodeUtf8 . T.pack
| ^^^^^^^^^^^^