将 OverloadedStrings 与 ByteString 类型一起使用
Using OverloadedStrings with ByteString type
我想从控制台输入一个字符串并输出一个 JSON 字符串。
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Data.Aeson
import Data.Map.Strict
main :: IO ()
main = interact $ encode
此代码失败。当然,我看到 encode
的类型为 ToJSON a => a -> Data.ByteString.Lazy.Internal.ByteString
,而 interact'
的类型为 String -> String
,但这就是我使用 OverloadedStrings
.
的原因
我该如何解决这个问题?对 String
?
执行强制转换
OverloadedString
s 仅适用于字符串 文字 。因此它将 "foo"
表达式转换为 fromString "foo"
.
但是您可以使用它来将其转换为 ByteString
。可以先用decodeUtf8 :: ByteString -> Text
to convert the ByteString
to a Text
, then use the String
data constructor of the Value
type,再对数据进行编码,所以:
主要模块
import Data.Aeson(Value(String), encode)
import qualified Data.ByteString as B
import Data.ByteString.Lazy(toStrict)
import Data.Text.Encoding(decodeUtf8)
main :: IO ()
main = B.interact (toStrict . encode . String . decodeUtf8)
这会将输入转换为 JSON 字符串文字。
我想从控制台输入一个字符串并输出一个 JSON 字符串。
{-# LANGUAGE OverloadedStrings #-}
module Main where
import Data.Aeson
import Data.Map.Strict
main :: IO ()
main = interact $ encode
此代码失败。当然,我看到 encode
的类型为 ToJSON a => a -> Data.ByteString.Lazy.Internal.ByteString
,而 interact'
的类型为 String -> String
,但这就是我使用 OverloadedStrings
.
我该如何解决这个问题?对 String
?
OverloadedString
s 仅适用于字符串 文字 。因此它将 "foo"
表达式转换为 fromString "foo"
.
但是您可以使用它来将其转换为 ByteString
。可以先用decodeUtf8 :: ByteString -> Text
to convert the ByteString
to a Text
, then use the String
data constructor of the Value
type,再对数据进行编码,所以:
主要模块
import Data.Aeson(Value(String), encode)
import qualified Data.ByteString as B
import Data.ByteString.Lazy(toStrict)
import Data.Text.Encoding(decodeUtf8)
main :: IO ()
main = B.interact (toStrict . encode . String . decodeUtf8)
这会将输入转换为 JSON 字符串文字。