我第一次设置 Haskell 开发环境的经验是常见的还是一次性的?

Posted

技术标签:

【中文标题】我第一次设置 Haskell 开发环境的经验是常见的还是一次性的?【英文标题】:Is my experience with setting up Haskell dev environment for the first time common or a one-off? 【发布时间】:2020-03-02 19:41:06 【问题描述】:

我决定从 Haskell 开始,但遇到了一个陌生的生态系统。我已经用短版和长版写下了我目前的结论(现在我意识到我遇到的问题可能是暂时的,将来不会适用,并意识到下面的文字可能不适合 SO)。

我现在特别想知道的是

我所描述的设置对退伍军人有意义吗? 为什么推荐 GHC 8.6.5 版本,8.8.2 有什么问题?

短版

如果这是您第一次接触 Haskell,并且您想安装 Haskell(ghccup、ghc、cabal-install、stack)和由 Visual Studio Code、Haskell Language Server 插件和 HIE 组成的开发环境。 确保按照 (https://docs.haskellstack.org/en/stable/README/#start-your-new-project) 的 stack new 和您正在安装的 HIE 都在解析 到ghcup安装的相同版本的GHC。

加长版

嗨,Haskellers!

我正在分享我对 Haskell 的尝试,希望能将其他人从一两个新手错误中拯救出来。 像我问过谷歌how to install haskell的所有明智的人一样, 这导致我进入以下页面https://www.haskell.org/platform/(我在 macOS 10.13.6 上)。 我已经按照推荐下载了 ghcup,然后安装了 ghc 8.6.5 和 cabal-install 3.0.0.0。 根据 ghcup,两者都是推荐的版本。我能够ghcup listghcup list -t all,一切看起来都很好。 stack 是下一个推荐的。 这个过程很简单,在堆栈完成了它需要做的所有事情之后,我 stack --version 告诉我我有Version 2.1.3, Git revision 0fa51b9925decd937e4a993ad90cb686f88fa282 (7739 commits) x86_64 hpack-0.31.2

堆栈文档的下一部分让我遇到了麻烦https://docs.haskellstack.org/en/stable/README/#start-your-new-project。 特别是 stack new my-project 的初学者将基于所谓的解析器设置一个新项目。 在这一点上我不知道或不关心的是,默认情况下它会使用 15.2 版本的解析器(我写这篇文章时的最新版本)来设置一个 项目的“包含电池”的隔离环境(请纠正我的任何错误假设/术语)。 我可能不知道的是,解析器 15.2“期望”找到 ghc 8.8.2,如果找不到,它会做明智的事情并安装它。 我直觉地理解了这个问题——这是正在解决的问题——然后我继续前进(这是在我找到https://github.com/commercialhaskell/lts-haskell#readme 之前)。

转到 IDE,google 将我带到尚未准备好迎接黄金时段的 haskell-language-server。下一个最好的事情是 haskell-ide-engine 可以被认为是 haskell-language-server 的一部分。 由于天真和对迄今为止的体验感到满意,我从源头构建了 hie,因为我对这两个都不感兴趣 在这一点上用 nix 做任何事情或弄清楚 Visual Studio Code DevContainer 是什么。 构建成功,到目前为止我已经安装了 HIE、ghcup、ghc、cabal-install、visual studio 代码包 Haskell Language Server 我已经准备好开始学习 Haskell 了。 除了 HIE 拒绝工作:/.

出了什么问题?

ghcup 在我的机器上安装了 ghc 8.6.5 stack new my-project 默认使用最新的解析器 15.2,它安装了 ghc 8.8.2(与项目隔离) HIE 通过查看 ghcup 安装的 ghc(8.6.5)自行构建(?) 结果是构建 HIE 的版本与 stack new my-project 设置的版本不匹配。 一旦我更好地了解了所涉及的部分,就很容易用谷歌搜索解决方案并迫使我彻底阅读文档。 错在我没有更好地关注我正在阅读的文档。然而,我并没有准备好去弄清楚 生态系统中虽小但至关重要的部分的细微差别。

我确实意识到整个情况完全是自己造成的,我可以在安装 GHC 并启动 GHCI 后立即开始学习该语言。我想知道我是不是走错了方向,还是大多数人都是这样开始的?

2020 年 7 月 25 日更新

Haskell 语言服务器现在更容易安装,请查看这篇文章和文章末尾的视频。 https://mpickering.github.io/ide/posts/2020-07-10-ghc-libdir.html

【问题讨论】:

这看起来是一个相当合理的体验。看起来你并没有做错什么;相反,文档和工具是这里的罪魁祸首。 stack 只是让您想知道为什么它要自己安装东西,而 Haskell IDE 生态系统一团糟。 投票重新开放。虽然我可以看到接近投票的来源,但这里有一个潜在的可回答问题(OP 的 HIE 设置出了什么问题),以及 HIE 贡献者的有用答案。编辑问题以使其更明显可能会有一些用处。 我同意,我的想法到处都是。我不确定如何将我的“核心”洞察力提取到一个简单的问题中。我想要达到的是某种‘嘿,你对 VS Code 很满意,对 Haskell 一无所知。这是您在深入研究文档之前应该做的正确设置!有这个必须匹配的基本依赖项“GHC 版本”,但是,遵循 haskell.org/platform -> docs.haskellstack.org/en/stable/README -> github.com/haskell/haskell-ide-engine 的“快乐路径”将无法让您进入工作设置。 【参考方案1】:

我所描述的设置对退伍军人有意义吗?

haskell 生态系统一开始可能看起来很奇怪(也许是这样!),开始学习语言基础知识也许最好的选择是你最后评论的内容(例如,data61 课程选择的那个)。

我认为问题的关键在于大多数 haskell 工具都与特定版本的独特 haskell 编译器耦合,此外,如果该工具必须解析、格式化或类型检查 haskell 源代码(就像编辑器和 ide 需要做的那样)。

但是,作为haskell-ide-engine 的合作者之一,我想让初学者尽可能顺利地安装和使用该工具。安装可以使用 stack 和 cabal 完成,而且,afaik 它不是自动的。

您必须使用该工具支持的最新 ghc 版本(当前为 ghc-8.8.2)执行 stack install.hs latest 来安装 hie。您也可以使用stack install.hs hie-$version f.e stack install.hs hie-8.6.5 安装特定版本。

如果您使用 cabal 安装 hie,安装程序会在 $PATH 中查找 ghc 版本,cabal-hie-install latest 会安装找到的最新支持版本。也许你是用 cabal 来安装 hie 的?

您可以安装多个版本的 hie,每次安装都会生成多个可执行文件:例如 hie 本身、hie-8.6hie-8.6.5 以及一个用于分析您的项目并选择更合适的 hie 版本的 hie-wrapper,如果有的话。

不要犹豫,建议如何改进流程。 有一些问题:

Easy setup process Precompiled executables

【讨论】:

感谢您抽出宝贵时间,感谢您富有洞察力的反馈!我意识到“下一个最好的东西是haskell-ide-engine……”听起来是错误的,当我第一次遇到事情时,我并没有打算将我写的任何东西作为批评而是诚实的想法(我决心弄清楚无论哪种方式)。感谢您指点我github.com/haskell/haskell-ide-engine/issues/1383,我会阅读时事,看看我是否可以贡献。 在我的情况下,ghcup 和堆栈都报告 8.8.3,但是当我尝试在 macos 上编译时我得到__1] 拒绝:hie-bios-0.4.0(冲突:haskell-ide-engine => hie-bios>=0.5 && @tofutim 我刚刚在 Windows 中尝试过,它可以工作,也许值得在问题跟踪器中打开一个问题? github.com/haskell/haskell-ide-engine/issues 在 jneira 的问题中随时抄送我

以上是关于我第一次设置 Haskell 开发环境的经验是常见的还是一次性的?的主要内容,如果未能解决你的问题,请参考以下文章

在 nix 上的 haskell 开发环境中使用 hoogle

如何在 NixOS 上使用新的 haskell-ng 基础架构?

GHCup安装haskell开发环境

GTKWindows下Haskell的GTK开发环境搭建

真随机数生成器 (TRNG)、Haskell 和经验/形式方法

Linux 网络常见问题排错经验总结