simpleHTTP
является полиморфным. Оставшийся орган реагирования может быть любым из строгих ByteString
, ленивый ByteString
, или String
. Он выбирает один из тех, которые соответствуют значению Request ty
, переданному ему. К сожалению, HTTP
- это старая библиотека и плохо поддерживается - она как бы минимально добавила полиморфизм, необходимый для работы с этими тремя типами, но не везде он мог бы сделать библиотеку удобной для использования. Например, использование getRequest
заставляет ответ быть String
, аннулируя полиморфизм в .
Вот минимальный рабочий пример захвата содержимого этого URL-адреса с помощью HTTP
и декодирования их с помощью aeson
.
import Network.URI
import Network.HTTP
import Data.Aeson
-- There's absolutely no reason that this function shouldn't be in HTTP.
-- It's just as unsafe and terrible as getRequest is. In fact, this is a
-- strictly more general type than getRequest has, so there's no reason
-- it shouldn't just replace it.
getRequest_ :: HStream ty => String -> Request ty
getRequest_ s = let Just u = parseURI s in defaultGETRequest_ u
main :: IO()
main = do
rsp <- simpleHTTP $ getRequest_ "http://www.reddit.com/r/haskell.json"
body <- getResponseBody rsp
print (decode $ body :: Maybe Value)
Обратите внимание, что это использование decode
, что в конце концов прижимает вниз полиморфный тип simpleHTTP
там. Просто в этой версии это не противоречит тому, что getRequest
говорит о типе вашего кода.
Это действительно 'simpleHTTP' из пакета' HTTP'. Как я могу сказать, чтобы использовать правильную 'ByteString', чтобы я мог передать ее функции' decode'? – BinRoot
@Nick Просто подайте его на функцию 'decode'. Это все, что нужно, чтобы убедиться, что это правильный тип. В этом весь смысл вывода типа. – Carl
После получения 'rsp', я попробовал' sb <- getResponseBody rsp', а затем 'decode sb', но это не удалось с ошибкой типа, потому что он ожидал' Data.ByteString.Lazy.Internal.ByteString', но вместо этого получил '[ Char] ' – BinRoot