gpt4 book ai didi

haskell - Haskell 环境中的重复包?

转载 作者:行者123 更新时间:2023-12-03 09:53:21 25 4
gpt4 key购买 nike

我把this在文件中(见底部)并在 ghci 中加载它时出现以下错误(即启动 ghci 然后 :l file):

7:13: error:
• Couldn't match expected type ‘network-uri-2.6.1.0@network-uri-2.6.1.0-7BN1tbB3iHQ2XgvmqLAYph:Network.URI.URI’
with actual type ‘Network.URI.URI’
NB: ‘Network.URI.URI’
is defined in ‘Network.URI’
in package ‘network-uri-2.6.1.0@network-uri-2.6.1.0-80FpvaNUTSDFCPv0sSze40’
‘network-uri-2.6.1.0@network-uri-2.6.1.0-7BN1tbB3iHQ2XgvmqLAYph:Network.URI.URI’
is defined in ‘Network.URI’
in package ‘network-uri-2.6.1.0@network-uri-2.6.1.0-7BN1tbB3iHQ2XgvmqLAYph’

我是否以某种方式安装了两个略有不同的 network-uri 版本,或者这是什么?我该如何解决?

我几乎没用过 cabal,但尝试了 cabal install --reinstall network-uri,运行正常,但问题仍然存在。

文件内容:

import Network.HTTP
import Network.URI (parseURI)
import Data.Maybe (fromJust)
myRequestURL = "http://www.virginia.edu/cgi-local/ldapweb"
myRequest :: String -> Request_String
myRequest query = Request {
rqURI = fromJust $ parseURI myRequestURL
, rqMethod = POST
, rqHeaders = [ mkHeader HdrContentType "text/html"
, mkHeader HdrContentLength $ show $ length body ]
, rqBody = body
}
where body = "whitepages=" ++ query
main :: IO ()
main = do
response <- simpleHTTP $ myRequest "poon"
putStrLn ""

编辑 重新安装了 haskell 平台。在此之后,ghc-pkg list 报告所有包在 (?) /usr/lib/ghc/package.conf.d 下,以及我试图复制的程序加载得很好。

EDIT 2 在运行 cabal install some-pkg 之后,ghc-pkg list 报告说新安装的东西在另一个目录中。实际上,~/.cabal/config 指定了用户的安装目录,以及全局的安装目录。这一切应该如何妥善管理?

最佳答案

GHC 理解包数据库的概念。 Cabal 管理多个包数据库。有一个系统包数据库和一个用户包数据库。当您使用 Cabal V1 编译某些东西时,它会使用这些包数据库的联合。这有点像定时炸弹,因为如您所见,当您有多个相同的包时,GHC 不喜欢它。当您发出 cabal install network-uri 时,cabal 决定将该包的一个副本安装到您​​的用户数据库中,尽管您在系统数据库中已经有一个。当您尝试使用 ghc 时,它会选择两个副本并感到困惑。因为 cabal 不支持删除包,所以您的 Haskell 安装非常失败,因此您重新安装了。我相信你可以做一个更保守的 rm ~/.ghc,或者,如果你真的很冒险,使用低级 ghc-pkg 命令来编辑包数据库。

既然您已经重新安装了平台,我强烈建议您永远不要再使用cabal install。它旧了,坏了,cabal 本身告诉你不要使用它。如果您使用的是 Platform,我认为它里面有 stack,这是一个不同的构建管理器,基于 Cabal,它不容易出现这种损坏。或者,您可以只使用 V2 系列的 cabal 命令,这是我更喜欢的。

Cabal V2 不直接支持您的用例,您可以在其中全局安装一个包并针对它编译一个程序。这是因为这样做从根本上是错误的:全局包数据库实际上对 GHC 不起作用。 Cabal V2 所做的是将包安装到您的主目录 ~/.cabal/store。然后你必须明确地告诉它你想要哪些包,它会构建一个包数据库,其中包含每个需要的包,没有任何疑惑。您可以通过发布获得包含特定软件包集的 REPL(这会将您带到一个临时目录;您可能需要 :cd 自己返回。)

cabal v2-repl -b network-uri -b package2 -b etc

如果你想用 ghc 和一组包实际编译文件,你必须用 .cabal 文件实际定义一个包。这是一个 stub .cabal 文件:

name:          temporary-pkg
version: 0.0.0.0
build-type: Simple
cabal-version: >=2.0
executable main -- if there is no Main, say "library" instead of "executable <name>"
default-language: Haskell2010
main-is: Main.hs -- only valid in executable stanzas
hs-source-dirs: src -- source files go here
build-depends: base, network-uri, package2, etc -- packages go here

创建并进入一个目录,将它放在 temporary-pkg.cabal 中,将您的源代码放在 src/ 中,然后您可以发布诸如 cabal v2 之类的东西-buildcabal v2-replcabal v2-exec main 等。cabal 将关闭并从 Hackage 安装依赖项根据需要进入 ~/.cabal/storecabal v2-install 因此在这里用处不大。一般而言,v2-installing 库是不必要的,但 v2-installing 包含可执行文件的包很有用。同样,出于卫生原因,您必须列出所有要从中导入的包,但您不需要列出它们的依赖项或任何类似的疯狂内容。

Cabal V2 仍然不支持卸载包,但重点是这不是必需的。但是,如果您发现 ~/.cabal/store 变得太大而不符合您的喜好,您可以直接对其进行核对,并且应该在请求包时进行备份。

关于haskell - Haskell 环境中的重复包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57293827/

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