2013-11-19 1 views
1

Я новичок в Snap и Haskell. Я пытаюсь включить этот вывод:Haskell Snap rendering JSON с маршрута

[("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)]' 

Так что мне нужно, чтобы выяснить, как бороться с Может быть. Я читаю об этом, но какая-то помощь будет оценена.

+0

Где находятся функции 'toJSNO' и' writeJSON'? – DiegoNolan

+0

о, простите меня. трассировка стека правильная, это функция writeJSON, исходящая из Snap.Extras.JSON. toJSON был еще одним вариантом, который я исследовал из пакета json, Text.JSON (аналогично, не повезло). –

+0

Можете ли вы поместить немного больше кода? Это в одном из ваших обработчиков? Похоже, проблема в том, что вам нужно указать экземпляр «MonadSnap», который вы используете, но компилятор не может вывести его из кода, который у вас есть. По умолчанию 'MonadSnap' вы будете, если вы просто используете, когда snap генерирует, когда вы вводите' snap init default', будет 'Handler App App'. Если вы поместили эту функцию в другую монаду, это может быть проблемой. – DiegoNolan

ответ

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]]" 
+0

, это помогает мне, спасибо за помощь. Я добавил дополнительную информацию. По-моему, мне кажется, что этого недостаточно. –

+0

Эта проблема, похоже, заключается в том, что вы передали что-то «возможно», которое не было завернуто в «Может быть». В частности, 'Just :: a -> Maybe a' завершает' Maybe 'и' возможно :: b -> (a -> b) -> Возможно, a -> b' "разворачивает" их. Вы передали 'result' в качестве третьего параметра, и он не был завершен в' Maybe', поэтому компилятор отклонил его. –

+0

Ах, да! 'writeJSON $ Just (results)'! Удивительно, большое спасибо. Теперь мне просто нужно выяснить, как отображать его как объект, а не массив массивов. –