gpt4 book ai didi

haskell - nix-shell 为 #! runghc 的解释器

转载 作者:行者123 更新时间:2023-12-04 07:32:53 27 4
gpt4 key购买 nike

我正在尝试使用 nix-shell 作为 #! runghc 的包装器,如手册页中所建议的那样。但它找不到库。给定以下示例,从手册页中删减

#! /usr/bin/env nix-shell
#! nix-shell -i runghc -p haskellPackages.HTTP

import Network.HTTP

main = return ()

我得到以下结果:
[~:0]$ ./nixshelltest 

nixshelltest:4:1: error:
Failed to load interface for ‘Network.HTTP’
Use -v to see a list of the files searched for.
[~:1]$

在我看来,这正是 nix-shell -p 要避免的。

我做错了什么,错过了重点,还是有错误?这既是在 nixOS 17.03 主机上,也是在 Ubuntu 之上运行 nix 17.09 的主机。

谢谢,

最佳答案

您用于运行脚本的环境缺少一个步骤。它有一个 GHC 和一个 HTTP 包,但编译器不知道这个包。

GHC 和库包在 nix 中的工作方式可能与您所期望的有点“由内而外”。您实际上需要安装一个“依赖于”您想要的所有库的编译器,而不是简单地单独安装编译器和库。原因是 GHC 旨在通过修改安装 GHC 的文件树来添加库包。在只有一个系统 GHC 安装的可变文件系统上,您只需在安装库时修改 GHC,但 nix 不能。 Nix 必须能够安装一个永不改变的卡住 GHC,并且可能有很多。

所以发生的事情是你安装了一个小包装器,它依赖于底层的“原始”GHC 安装和你想要使用的所有库。然后,包装器就像注册了这些库的 GHC 安装一样,实际上不需要复制整个 GHC 安装。当你自己安装一个库包时,它只是静止不动,没有任何 GHC 能够仅仅通过它的存在来找到它。

实际上,您在此处显示的脚本实际上并没有指定它应该安装编译器。它只要求 HTTP图书馆。当我尝试你的脚本时,我得到了 command not found: runghc . runghc仅在您的系统上工作,因为当您运行它时它碰巧已经在您的路径中(可能是因为您的配置文件中安装了 GHC?),并且 GHC 没有与 HTTP 一起安装包,所以看不到。 nix-shell仅将库添加到环境中无济于事。

你需要做的是使用这一行:

#! nix-shell -i runghc -p "ghc.withPackages (ps: [ ps.HTTP ])"

你也没有安装 ghcHTTP直接地;而是 ghc.withPackages函数计算一个安装 GHC 包装器的 nix 包,该包装器知道 HTTP haskell 包。在幕后,这取决于没有额外库的“原始”GHC,还取决于 HTTP库,并且也会导致安装这些库。

如果你使用很多不同的 Haskell 环境(可能通过像这样的 nix-shell 脚本,每个都需要一组不同的库),那么你最终会得到一个唯一的 withPackages为您曾经使用的每个库组合安装在系统上的包装器。但这没关系,因为包装器本身很小,并且 nix 能够在所有这些环境之间共享和重用底层 GHC 和库包。

关于haskell - nix-shell 为 #! runghc 的解释器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45022141/

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