Haskell Snap рендеринг JSON с маршрута
Я новичок в Snap и Haskell. Я пытаюсь включить этот вывод:
[("LDPNLNDQQFHUKIWZII",2191.12),("NLNDQQFHUKIWZIIXDC",2195.0696),("NZRAIEUALDPNLNDQQFH",2192.0503)]
в JSON. Так что я знаю, что тип [[String, Double)], но это не помогает мне с сообщением об ошибке, возникающим из GHCi при вводе writeJSON [("LDPNLNDQQFHUKIWZII",2191.12),("NLNDQQFHUKIWZIIXDC",2195.0696),("NZRAIEUALDPNLNDQQFH",2192.0503)]
:
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)]'
Поэтому мне нужно выяснить, как бороться с Возможно. Я читаю на нем, но некоторая помощь будет оценена.
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]]"