gpt4 book ai didi

haskell - 常量超出范围但定义明确(或者我相信)

转载 作者:行者123 更新时间:2023-12-01 11:13:45 26 4
gpt4 key购买 nike

我正在尝试使用 Scalpel 抓取网站,但使用他们自己的示例代码遇到了超出范围的错误。该示例可在他们的 github page 上找到。 ,部分我的抓取目标未返回我预期的标记。

我正在使用 ghc-8.6.4 Haskell 编译器。

我的 packages.yaml依赖项是:

dependencies:
- base >= 4.7 && < 5
- http-conduit
- http-client
- http-client-tls
- http-types
- scalpel

编码:
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}

module Example where

import Text.HTML.Scalpel
import qualified Network.HTTP.Client as HTTP
import qualified Network.HTTP.Client.TLS as HTTP
import qualified Network.HTTP.Types.Header as HTTP

-- Create a new manager settings based on the default TLS manager that updates
-- the request headers to include a custom user agent.
managerSettings :: HTTP.ManagerSettings
managerSettings = HTTP.tlsManagerSettings {
HTTP.managerModifyRequest = \req -> do
req' <- HTTP.managerModifyRequest HTTP.tlsManagerSettings req
return $ req' {
HTTP.requestHeaders = (HTTP.hUserAgent, "My Custom UA")
: HTTP.requestHeaders req'
}
}

main = do
manager <- Just <$> HTTP.newManager managerSettings
html <- scrapeURLWithConfig (def { manager }) url $ htmls anySelector
maybe printError printHtml html
where
url = "https://www.google.com"
printError = putStrLn "Failed"
printHtml = mapM_ putStrLn

从代码示例中可以看出, manager constant 坐在 def 旁边功能。但它似乎隐藏了 manager不知何故...我无法确定出了什么问题。
stack build 的整个控制台输出命令,其中包含报告的错误:
jroyer$ stack build
my-okr-haskeller-0.1.0.0: build (lib + exe)
Preprocessing library for my-okr-haskeller-0.1.0.0..
Building library for my-okr-haskeller-0.1.0.0..
[2 of 3] Compiling Example ( src/Example.hs, .stack-work/dist/x86_64-osx/Cabal-2.4.0.1/build/Example.o )

/Users/jroyer/Projects/bizgithub/my-okr-haskeller/src/Example.hs:26:40: error: Not in scope: ‘manager’
|
26 | html <- scrapeURLWithConfig (def { manager }) url $ htmls anySelector
| ^^^^^^^


-- While building package my-okr-haskeller-0.1.0.0 using:
/Users/jroyer/.stack/setup-exe-cache/x86_64-osx/Cabal-simple_mPHDZzAJ_2.4.0.1_ghc-8.6.4 --builddir=.stack-work/dist/x86_64-osx/Cabal-2.4.0.1 build lib:my-okr-haskeller exe:my-okr-haskeller-exe --ghc-options " -ddump-hi -ddump-to-file -fdiagnostics-color=always"
Process exited with code: ExitFailure 1

最佳答案

编辑:我可以用旧版本的手术刀重现提问者的问题,提问者提到他们正在使用:

[1 of 1] Compiling Example          ( Main.hs, /var/folders/m7/_2kqsz4n4c3ck8050glq4ggr0000gn/T/cabal-repl.-26184/dist-newstyle/build/x86_64-osx/ghc-8.6.4/fake-package-0/x/script/build/script/script-tmp/Example.o )

Main.hs:34:40: error: Not in scope: ‘manager’
|
34 | html <- scrapeURLWithConfig (def { manager }) url $ htmls anySelector
| ^^^^^^^
./so.hs 16.94s user 3.89s system 114% cpu 18.155 total

这是一个次优的错误消息,似乎是由于使用了命名字段双关语和一个不是字段名称的变量。也就是说, Config在那个版本的 scalpel没有经理字段。我们可以在一个较小的示例中重现此问题:
% cat test.hs
{-# LANGUAGE NamedFieldPuns #-}
data Foo = Foo { bar :: Int } deriving (Show)
main :: IO ()
main = print (Foo { zar})
where zar = 23 :: Int
% ghc test.hs
...snipt...
test.hs:4:21: error:
Not in scope: ‘zar’
Perhaps you meant ‘bar’ (line 3)
|
4 | main = print (Foo { zar})

因此,解决方案是更新到更新版本的手术刀。

html <- scrapeURLWithConfig (def { manager }) url $ htmls anySelector

我不知道这应该是什么。具体 (def { manager }) .这不是我熟悉的任何语法。

你在哪里 manager ,应该有一个字段。例如:
def { someField = someValue }

不是你所拥有的 def { someValue }这没有任何意义。

啊,NamedFieldPuns。老实说,我从未使用过它们,看着它们,我发现自己更喜欢 RecordWildCards。继续。

查看黑线鳕,字段名称是 manager所以你有一个 manager字段和 manager命名字段双关的值。我需要为 def 添加导入.同时我冒昧地使用了 cabal和一个明确的关于所有包的shebang:
#! /usr/bin/env cabal
{- cabal:
build-depends:
base >= 4
, scalpel == 0.6.0
, http-types == 0.12.3
, http-client-tls == 0.3.5.3
, http-client == 0.6.4
, data-default == 0.7.1.1
-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}

module Main where

import Data.Default
import Text.HTML.Scalpel
import qualified Network.HTTP.Client as HTTP
import qualified Network.HTTP.Client.TLS as HTTP
import qualified Network.HTTP.Types.Header as HTTP

-- Create a new manager settings based on the default TLS manager that updates
-- the request headers to include a custom user agent.
managerSettings :: HTTP.ManagerSettings
managerSettings = HTTP.tlsManagerSettings {
HTTP.managerModifyRequest = \req -> do
req' <- HTTP.managerModifyRequest HTTP.tlsManagerSettings req
return $ req' {
HTTP.requestHeaders = (HTTP.hUserAgent, "My Custom UA")
: HTTP.requestHeaders req'
}
}

main = do
manager <- Just <$> HTTP.newManager managerSettings
html <- scrapeURLWithConfig (def { manager = manager }) url $ htmls anySelector
maybe printError printHtml html
where
url = "https://www.google.com"
printError = putStrLn "Failed"
printHtml = mapM_ putStrLn

这似乎运行良好。注意包含 main 的模块本身应该是 Main .

关于haskell - 常量超出范围但定义明确(或者我相信),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56048487/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com