我正在尝试使用String构造函数将Text匹配到aeson Value,并且遇到编译错误。以下示例程序说明了我遇到过的问题。
digest("2016_Silverado_1500__CW_LS__Standard_Fragile_Static_US_ENG_v1_160x600.jpg", algo="sha1", serialize=F)
[1] "be5c711f15f874ecdcb5b99e655264afa53170c5"
如图所示,我试图获取文字"在这里"模式匹配到Aeson' String'值构造函数。我认为这个程序应该模式匹配文本到Aeson字符串并打印"匹配"。但该程序无法编译。相反,我收到以下错误:
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.Text
import qualified Data.Aeson
main = print $
case ("here" :: Data.Text.Text) of
(Data.Aeson.String x) -> "match"
_ -> "no match"
它表示模式预期Text而实际类型是aeson Value。但显然Text是由类型注释标记的(" here" :: Data.Text.Text)。我不明白为什么我会收到这个错误。模式匹配文本到aeson通过String构造函数的值似乎是在this aeson tutorial中完成的,我不明白为什么它在我的例子中也不起作用。
答案 0 :(得分:1)
它表示模式预期Text而实际类型是aeson Value。但显然是文本由类型注释标记
匹配的值确实是Text
类型。但是您匹配的模式不是Text
类型的模式;相反,它是Value
类型的模式。出于显而易见的原因,您无法将一种类型的值与另一种类型的模式匹配。
有许多可能的修复,但很难选择一个建议,因为你几乎没有说过你想要做什么。 可能您打算将Text
解析为Value
并检查它是哪种值:
case decode (fromStrict (encodeUtf8 "\"match\"")) of
Just (String x) -> "match"
Just _ -> "no match"
Nothing -> "invalid JSON"
但是,我怀疑你实际上只是误解了如何使用aeson,并且应该编写FromJSON
实例(或使用现有实例),而不是试图直接使用Text
值。例如,要将JSON值解析为Text
,您可以重用FromJSON
的现有Text
实例来编写:
case decode "\"match\"" of
Just v -> Data.Text.putStrLn v
Nothing -> putStrLn "invalid JSON"
同样,这两个建议都是纯粹的推测,因为这个问题在更大的目标上是多么轻松。