Haskell Snap从路线渲染JSON

时间:2013-11-19 21:27:03

标签: json haskell haskell-snap-framework

我是Snap和Haskell的新手。我试图改变这个输出:

[("LDPNLNDQQFHUKIWZII",2191.12),("NLNDQQFHUKIWZIIXDC",2195.0696),("NZRAIEUALDPNLNDQQFH",2192.0503)]

进入JSON。所以我知道类型是[(String,Double)],但在输入writeJSON [("LDPNLNDQQFHUKIWZII",2191.12),("NLNDQQFHUKIWZIIXDC",2195.0696),("NZRAIEUALDPNLNDQQFH",2192.0503)]时,这并不能帮助我解决GHCi产生的错误信息:

No instance for (MonadSnap m0) arising from a use of `writeJSON' The type variable `m0' is ambiguous Possible fix: add a type signature that fixes these type variable(s) Note: there are several potential instances: instance MonadSnap m => MonadSnap (Control.Monad.Trans.Cont.ContT c m) -- Defined in `snap-core-0.9.5.0:Snap.Internal.Instances' instance (MonadSnap m, Control.Monad.Trans.Error.Error e) => MonadSnap (Control.Monad.Trans.Error.ErrorT e m) -- Defined in `snap-core-0.9.5.0:Snap.Internal.Instances' instance MonadSnap m => MonadSnap (Control.Monad.Trans.List.ListT m) -- Defined in `snap-core-0.9.5.0:Snap.Internal.Instances' ...plus 8 others In the expression: writeJSON x In an equation for `it': it = writeJSON x

我没有与当前的数据结构结合(我只是创建它以聚集氨基酸序列及其质量)。理想情况下,我会得到如下所示的JSON数据:

{ "LDPNLNDQQFHUKIWZII":2191.12, "NLNDQQFHUKIWZIIXDC":2195.0696, "NZRAIEUALDPNLNDQQFH":2192.0503 }

输出[("LDPNLNDQQFHUKIWZII",2191.12),("NLNDQQFHUKIWZIIXDC",2195.0696),("NZRAIEUALDPNLNDQQFH",2192.0503)]由一个函数计算,该函数从用户获取两个输入:原始肽序列和重量(程序从肽序列中找到等于输入重量的片段)

感谢任何帮助/指示。谢谢!

其他信息:

我使用snap init barebones生成了应用。这是处理程序的样子。我在writeJSON result行收到错误。我打算使用getParam行,但是开始我只是想获得JSON响应。

possibleMatches :: Snap ()
possibleMatches = do
  peptideSequence <- getParam "peptide_sequence"
  weight          <- getParam "weight"
  let sequence = "V(3D)NK(3F)NKEXCNZRAIEUALDPNLNDQQFHUKIWZIIXDC"
  let weight = 2194.9
  let results = calculationResults weight sequence
  let result = take 1 [ seq | (seq,wt) <- results ]
  maybe (writeBS "must specify params in URL")
         writeJSON result

编译器的错误是:

Couldn't match expected type `Maybe a0'
                with actual type `[([Char], Float)]'

所以我需要弄清楚如何处理Maybe。我正在阅读它,但一些帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

writeJSON的类型为

writeJSON :: (MonadSnap m, ToJSON a) => a -> m ()

在编译器可以运行代码之前,必须将am解析为特定类型。您当然可以使用[(String, Double)]类型的对象作为输入,因为String的实例为ToJSONDouble的实例也是如此,ToJSON的任何一对实例(即instance (ToJSON a, ToJSON b) => ToJSON (a, b)),最后是ToJSON个实例的列表(即instance ToJSON v => ToJSON [a])。

所以问题完全在于试图确定m是什么。编译器抱怨说,只要m是“任何东西”,它就不能确定它是MonadSnap的实例。我们可以至少通过声明它是如此

来确保类型检查器
>>> :t writeJSON [("foo", 3)] :: MonadSnap m => m ()
writeJSON [("foo", 3.0)] :: MonadSnap m => m ()

但是我们需要在运行之前选择m的具体选择。如果你有一个使用MonadSnap的测试应用程序,那么你可以在那里嵌入这行代码。

然而,对于测试,您可能应该使用writeJSON依赖的函数:encode来自Data.Aeson

>>> encode [("foo", 3.0)]
"[[\"foo\",3.0]]"