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]]"
Другие вопросы по тегам