无法将预期类型“Request”与实际类型“[Char]”相匹配

Couldn't match expected type ‘Request’ with actual type ‘[Char]’

我是 Haskel 的新手,我正在尝试 运行 使用 http-conduit 的简单示例,该示例是他们 documentation.[=19= 中提供的示例]

但是,当 运行 运行程序时,我总是得到:

    • 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"
   |                         ^^^^^^^^^^^^^^^^^^^^^^^^

我尝试用 cabal 和 stack 创建一个项目,添加 http-conduitaeson 作为依赖项,但仍然出现错误。

不应该将 url 隐式转换为 Request 吗?

我尝试导入 Request 并尝试从 url 创建一个 Request,但它抱怨:

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’

您需要启用 OverloadedStrings extension [schoolofhaskell]。您可以将 LANGUAGE pragma 添加到文件顶部,因此:

{-# <b>LANGUAGE OverloadedStrings</b> #-}

-- …

此扩展将隐式添加 fromString :: IsString a => String -> a to each string literal (not to be confused with an expression with type String). It makes it more convenient to work with string-like data such as for example Text

但是请注意,转换是在 运行时 完成的,因此如果不是所有 String 都映射到(有效的)Request 对象,那么您只有在评估 Request 时才会看到它。

Shouldn't the url be implicitly converted to a Request?

在Haskell中,没有隐式转换,您总是通过函数转换数据。 OverloadedStrings 只是向 文字 添加了一个隐式函数调用,因此这意味着字符串文字现在可以采用属于 [=24 的任何类型的类型=].