我是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。我正在阅读它,但一些帮助将不胜感激。
答案 0 :(得分:1)
writeJSON
的类型为
writeJSON :: (MonadSnap m, ToJSON a) => a -> m ()
在编译器可以运行代码之前,必须将a
和m
解析为特定类型。您当然可以使用[(String, Double)]
类型的对象作为输入,因为String
的实例为ToJSON
,Double
的实例也是如此,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]]"