Не удалось сопоставить ожидаемый тип «Запрос» с фактическим типом «[Char]»

Я новичок в Haskel, я пытаюсь запустить простой пример, используя http-conduit, пример приведен в их документация.

Однако при запуске программы я всегда получаю:

    • Couldn't match expected type ‘Request’ with actual type ‘[Char]’
    • In the first argument of ‘httpLBS’, namely
        ‘"http://httpbin.org/get"’
      In a stmt of a 'do' block:
        response <- httpLBS "http://httpbin.org/get"
      In the expression:
        do response <- httpLBS "http://httpbin.org/get"
           putStrLn
             $ "The status code was: " ++ show (getResponseStatusCode response)
           print $ getResponseHeader "Content-Type" response
           L8.putStrLn $ getResponseBody response
   |
12 |     response <- httpLBS "http://httpbin.org/get"
   |                         ^^^^^^^^^^^^^^^^^^^^^^^^

Я пытался создать проект как с кабалой, так и со стеком, добавить http-conduit и aeson в качестве зависимостей, но все равно получаю ошибку.

Разве URL-адрес не должен быть неявно преобразован в Request?

Я пытался импортировать Request и попытаться создать Request из URL-адреса, но он жалуется:

import Network.HTTP.Client.Request

<no location info>: error:
    Could not load module ‘Network.HTTP.Client.Request’
    it is a hidden module in the package ‘http-client-0.6.4.1’

person ElBaulP    schedule 24.03.2021    source источник
comment
Я думаю, что вы получите это сообщение об ошибке, если вы каким-то образом забыли включить OverloadedStrings. Однако документация, на которую вы указываете, действительно включает это, поэтому не совсем понятно, зачем вы ее получили. С другой стороны, вы не пишете, как именно вы пытаетесь запустить программу.   -  person Mark Seemann    schedule 24.03.2021
comment
Я добавлял функцию LANGUAGE не в то место, чуть ниже, а не вверху файла.   -  person ElBaulP    schedule 24.03.2021


Ответы (1)


Вам необходимо включить OverloadedStrings расширение [schoolofhaskell]. Вы можете добавить прагму LANGUAGE в начало файла, поэтому:

{-# LANGUAGE OverloadedStrings #-}

-- …

Это расширение неявно добавит fromString :: IsString a => String -> a к каждой строке литерал (не путать с выражением с типом String). Это делает более удобной работу со строковыми данными, такими как, например, Text.

Однако имейте в виду, что преобразование выполняется во время выполнения, поэтому, если не все String сопоставляются с (допустимым) Request объектом, вы увидите это только при оценке Request.

Разве URL-адрес не должен быть неявно преобразован в запрос?

В Haskell нет неявных преобразований, вы всегда конвертируете данные через функции. OverloadedStrings просто добавляет неявный вызов функции к литералам, и, таким образом, это означает, что строковый литерал теперь может принимать в качестве типа любой тип, который является членом IsString класс типа.

person Willem Van Onsem    schedule 24.03.2021
comment
Arg, глупый я, у меня была функция LANGUAGE немного ниже в файле, а не в самом верху. Спасибо!. И спасибо также за подробное объяснение. - person ElBaulP; 24.03.2021