(Предупреждение для новичков в Haskell)
Вот фрагмент кода, с которым я борюсь. По сути, я получаю JSON, поступающий из веб-сокета, и хочу проанализировать его с помощью Aeson, не определяя отдельные типы данных для каждого ответа.
import Data.Aeson
import qualified Network.WebSockets as WS
aria2WebsocketReceiver :: WS.Connection -> IO ()
aria2WebsocketReceiver conn = do
msg <- WS.receiveData conn
let res = decode msg
let v = flip parseMaybe res $ \o -> do
r <- o .: "result"
version <- r .: "version"
enabledFeatures <- r .: "enabledFeatures"
id_ <- r .: "id"
return $ "version=" ++ version
putStrLn (show v)
aria2WebsocketReceiver conn
Вот ошибки компиляции, с которыми я сталкиваюсь:
Nightwatch/Telegram.hs:244:13:
No instance for (FromJSON a0) arising from a use of ‘decode’
The type variable ‘a0’ is ambiguous
Relevant bindings include
res :: Maybe a0 (bound at Nightwatch/Telegram.hs:244:7)
Note: there are several potential instances:
instance FromJSON Chat -- Defined at Nightwatch/Telegram.hs:90:10
instance FromJSON Message
-- Defined at Nightwatch/Telegram.hs:106:10
instance FromJSON TelegramResponse
-- Defined at Nightwatch/Telegram.hs:122:10
...plus two others
In the expression: decode msg
In an equation for ‘res’: res = decode msg
In the expression:
do { msg <- WS.receiveData conn;
let res = decode msg;
let v = flip parseMaybe res $ ...;
putStrLn (show v);
.... }
Nightwatch/Telegram.hs:246:44:
Couldn't match type ‘Maybe a0’
with ‘unordered-containers-0.2.5.1:Data.HashMap.Base.HashMap
Text Value’
Expected type: Object
Actual type: Maybe a0
Relevant bindings include
o :: Maybe a0 (bound at Nightwatch/Telegram.hs:245:34)
res :: Maybe a0 (bound at Nightwatch/Telegram.hs:244:7)
In the first argument of ‘(.:)’, namely ‘o’
In a stmt of a 'do' block: r <- o .: "result"
В основном я пытаюсь воспроизвести пример «Работа с AST», приведенный на https://hackage.haskell.org/package/aeson-0.10.0.0/docs/Data-Aeson.html