2016-11-22 4 views
3

にパーサの外に値を取得するために、私はIOでの解析JSONをやろうとしている:ハスケルアイソーン:どのようにIOモナド

{-# LANGUAGE OverloadedStrings #-} 
import Network.HTTP.Simple 
import Data.Aeson 
import Data.Maybe (fromJust) 

main :: IO() 
main = do 
    response <- getResponseBody <$> httpJSON "http://localhost:9200" :: IO Object 
    name <- fromJust <$> response .: "name" :: Parser String 
    print "hi" 

私はエラーを取得する:

/home/nut/dev/haskell/elastic/app/Main.hs:39:11: error: 
    • Couldn't match type ‘Parser’ with ‘IO’ 
     Expected type: IO String 
     Actual type: Parser String 
    • In a stmt of a 'do' block: 

私は、どのようにjsonの結果からnameを取得しますか?

+2

を行うことができます

parseMaybe (.: "name") :: Object -> Maybe String 

を持っている: "名前"'で'IO'ですが、' Parser'値です。私はAesonにはあまりよく慣れていませんが、(Data.Aeson.Types.parse'または 'parseMaybe'を使って)純粋にパーサを実行する必要があると思います。 –

答えて

3

アイソーンがParser aからaに行くの機能の束を持っています

parse  :: (a -> Parser b) -> a -> Result b 
parseEither :: (a -> Parser b) -> a -> Either String b 
parseMaybe :: (a -> Parser b) -> a -> Maybe b 

あなたは、例えば持っているので、もし

(.: "name") :: Object -> Parser String 

、あなたはそう、あなたが `fromJust <$>応答の結果をバインドしようとしているように見えます

{-# LANGUAGE OverloadedStrings #-} 
import Network.HTTP.Simple 
import Data.Aeson 
import Data.Maybe (fromJust) 
import Data.Aeson.Types -- new import for parseMaybe 

main :: IO() 
main = do 
    response <- getResponseBody <$> httpJSON "http://localhost:9200" 
    let name = fromJust $ parseMaybe (.: "name") response :: String 
    print "hi" 
+0

今私は少し混乱しています。 '(。:" name "):: Value - > Parser String'ではないでしょうか? 'Object'の型は' Value'ですか? Aesonライブラリについて混乱して申し訳ありません... – LudvigH

+0

はい、正しいです。式 'fromJust $ parseMaybe(。:" name ")response'は、' String': '(。:" name "):: Value-> Parser String'型と' response :: Value'という名前を持つものです。 'のように、' a〜Value'と 'b〜String'で' parseMaybe ::(a - > Parser b) - > a - > Maybe b'を適用することができます。 – Cactus

+1

言うまでもなく、何かのために 'name'を使っただけでは(最後の行を' print "hi" 'からputStrLn $ unwords [" Hi、 "、name]'に変更してその型を指定した場合) 'let name = ...'行に型名を書く必要はありません。 – Cactus

関連する問題