2

我是 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"
   |                         ^^^^^^^^^^^^^^^^^^^^^^^^

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

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

我尝试导入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’
4

1 回答 1

3

您需要启用OverloadedStrings扩展 [schoolofhaskell]。您可以将LANGUAGE编译指示添加到文件的顶部,因此:

{-# LANGUAGE OverloadedStrings #-}

-- …

此扩展将隐式添加fromString :: IsString a => String -> a到每个字符串文字(不要与type String的表达式混淆)。它使处理类似字符串的数据变得更加方便,例如Text.

但是要注意转换是在运行时完成的,所以如果不是所有String的 s 都映射到一个(有效的)Request对象,那么你只会在Request评估 s 时看到这个。

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

在 Haskell 中,没有隐式转换,您总是通过函数转换数据。简单地将OverloadedStrings隐式函数调用添加到文字中,因此这意味着字符串文字现在可以将作为类型类成员的任何类型作为IsString类型

于 2021-03-24T06:35:45.510 回答