Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell Aeson:如何在IO monad中从解析器中获取值_Haskell_Monads_Aeson - Fatal编程技术网

Haskell Aeson:如何在IO monad中从解析器中获取值

Haskell Aeson:如何在IO monad中从解析器中获取值,haskell,monads,aeson,Haskell,Monads,Aeson,我正在尝试在IO中进行JSON解析: {-# 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 &

我正在尝试在IO中进行JSON解析:

{-# 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"

那么如何从json结果中获得
名称

Aeson有一系列函数可以从
解析器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
那你有

parseMaybe (.: "name") :: Object -> Maybe String
所以你可以

{-# 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"
{-#语言重载字符串}
导入Network.HTTP.Simple
导入数据.Aeson
导入数据。可能(fromJust)
import Data.Aeson.Types--新导入的数据类型
main::IO()
main=do

response看起来您正试图绑定
响应的结果。
IO
中的“name”
,但它只是一个
解析器
值。我对Aeson不是很熟悉,但我认为您需要(纯粹)使用
Data.Aeson.Types.parse
parseMaybe
运行解析器。现在我有点困惑。它不是
(.:“name”)::Value->解析器字符串吗?
对象
的类型是
?很抱歉对伊森图书馆感到困惑…是的,这是正确的。整个表达式
来自$parseMaybe(.:“name”)response
,我们将其注释为具有type
String
(.:“name”)::Value->Parser String
,以及
response::Value
,因此我们可以应用
parseMaybe::(a->Parser b)->a->b
可能带有
a~值和
b~字符串
。当然,如果我们只是将
名称
用于任何规定其类型的内容(例如将最后一行从
print“hi”
更改为
putStrLn$unwords[“hi,,name]
),那么我们就不需要
let name=…
行中的类型注释了。我不熟悉多态性,因此解释很有帮助。:)谢谢!
{-# 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"