Haskell 不能';t匹配类型‘;[字符]’;与‘;Data.Text.Internal.Text’;

Haskell 不能';t匹配类型‘;[字符]’;与‘;Data.Text.Internal.Text’;,haskell,Haskell,我正试图通过以下示例了解如何在Haskell中构建JSON: module Main where import GHC.Exts import Data.Aeson import qualified Data.Text.Lazy.IO as T import qualified Data.Text.Lazy.Encoding as T val :: Value val = Object $ fromList [ ("numbers", Array $ fromList [Number

我正试图通过以下示例了解如何在
Haskell
中构建
JSON

module Main where


import GHC.Exts
import Data.Aeson
import qualified Data.Text.Lazy.IO as T
import qualified Data.Text.Lazy.Encoding as T

val :: Value
val = Object $ fromList [
  ("numbers", Array $ fromList [Number 1, Number 2, Number 3]),
  ("boolean", Bool True) ]

main :: IO ()
main = T.putStrLn . T.decodeUtf8 . encode $ val
当我试图编译时,编译器抱怨:

    • Couldn't match type ‘[Char]’ with ‘Data.Text.Internal.Text’
      Expected type: Item Object
        Actual type: ([Char], Value)
    • In the expression: ("boolean", Bool True)
      In the first argument of ‘fromList’, namely
        ‘[("numbers", Array $ fromList [Number 1, Number 2, ....]),
          ("boolean", Bool True)]’
      In the second argument of ‘($)’, namely
        ‘fromList
           [("numbers", Array $ fromList [Number 1, Number 2, ....]),
            ("boolean", Bool True)]’
   |
12 |   ("boolean", Bool True) ]
   |   ^^^^^^^^^^^^^^^^^^^^^^

您需要将
OverloadedStrings
扩展名放在文件顶部:

#!/usr/bin/env stack
-- stack script --resolver lts-12.7
{-# LANGUAGE OverloadedStrings #-}

import Data.Aeson
import qualified Data.Text.Lazy.Encoding as T
import qualified Data.Text.Lazy.IO as T
import GHC.Exts

val :: Value
val =
  Object $
  fromList
    [ ("numbers", Array $ fromList [Number 1, Number 2, Number 3])
    , ("boolean", Bool True)
    ]

main :: IO ()
main = T.putStrLn . T.decodeUtf8 . encode $ val
执行时:

$ stack fuse.hs
{"boolean":true,"numbers":[1,2,3]}

为了理解为什么这样做会起作用,您得到的错误是关于错误的字符串表示。Haskell有很多,例如,
ByteString
(严格或惰性)、
Text
(严格或惰性)、
String
(别名为
[Char]
)。最后一个是默认值,也是大多数情况下应该避免的

Aeson库使用
文本
作为字符串表示。您可以在字符串之前使用
T.pack
修复代码(将其转换为文本),如下所示:

val :: Value
val =
  Object $
  fromList
    [ (T.pack "numbers", Array $ fromList [Number 1, Number 2, Number 3])
    , (T.pack "boolean", Bool True)
    ]

或者您可以只启用
重载字符串
扩展名。当它打开时,Haskell编译器将尝试找出它应该使用的字符串表示形式。只需将
{-#LANGUAGE OverloadedStrings#-}
放在文件的顶部,它就可以工作。

注意,您可以使用堆栈的脚本功能轻松地重现内容:这将有助于其他人准确重现您的问题。