2015-12-06 2 views
0

Я хочу получить тело geocodeip.com с запросом POST (ip в текстовом поле).Haskell использовать данные POST ЗАПРОС

Вот мой код:

{-# OPTIONS_GHC -Wall #-} 
{-# LANGUAGE ForeignFunctionInterface #-} 
{-# LANGUAGE OverloadedStrings #-} 

module Main where 

import Foreign.C.Types 
import Foreign.C.String 

import Network.HTTP.Conduit 
import qualified Data.ByteString.Lazy as L 
import qualified Data.ByteString.Char8 as C8 
import Text.HTML.TagSoup 
getGPS :: String -> IO() 
getGPS ip = do 
    initReq <- parseUrl "http://www.geocodeip.com/" 
    let req = (flip urlEncodedBody) initReq $ [("IP", C8.pack ip)] 
    let res = withManager $ httpLbs req 
    tags <- fmap parseTags ((responseBody res)) 
    print tags 

--foreign export ccall getGPS :: CString -> IO() 

До сих пор она работает, если я «закончить», он действовал с L.putStr $ responseBody res ... но как я могу получить tags из этого?

компиляции Ошибка:

Couldn't match type ‘Response L.ByteString’ with ‘L.ByteString’ 
    Expected type: Response L.ByteString 
     Actual type: Response (Response L.ByteString) 
    In the first argument of ‘responseBody’, namely ‘res’ 
    In the second argument of ‘($)’, namely ‘responseBody res’ 
Failed, modules loaded: none. 

Как решить эту ошибку типа-?

+1

попробуйте 'let res = withManager $ httpLbs req' вместо' res <- withManager $ httpLbs req'. –

+0

Я отредактировал мое сообщение. еще ошибка –

ответ

1

Похоже, вы сбиты с толку по-нотации и монадическому/не монадическому. Вот как я это написал.

getGPS :: String -> IO() 
getGPS ip = do 
    initReq <- parseUrl "http://www.geocodeip.com/" 
    let req = urlEncodedBody [("IP", C8.pack ip)] initReq 
    res <- withManager $ httpLbs req 
    let tags = parseTags (responseBody res) 
    print tags 
+0

спасибо! но можете ли вы сказать мне, пожалуйста, где разница между 'let .. = ..' и' .. <- ..'? –

+0

'let' - это просто привязка имени, тогда как' <-' является частью обозначений. Вы можете прочитать здесь: https://en.wikibooks.org/wiki/Haskell/do_notation –