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#-}
放在文件的顶部,它就可以工作。注意,您可以使用堆栈的脚本功能轻松地重现内容:这将有助于其他人准确重现您的问题。