将 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 ?

执行强制转换

OverloadedStrings 仅适用于字符串 文字 。因此它将 "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 字符串文字。