Haskell开发工作流程(4种方式)

421 阅读4分钟

Haskell的一个奇妙之处在于,它提供了各种工具,允许不同的开发工作流程。在这篇博文中,我们将关注四个不同的工作流程来开发Haskell。这些是FP Complete团队自己经常使用的技术,我们希望与读者分享。

通过堆栈保存时自动编译--file-watch

这个工作流程是最简单的,如果你使用Stack,你可以把它引入你的日常工作中。要开始的话,你需要在你用来构建项目的stack命令上使用标志--file-watch (例如:stack build )。这个模式监视你项目中的所有Haskell文件,一旦检测到文件变化,它就会执行指定的堆栈命令。例如,假设你想在每次文件变化时运行项目的单元测试,你可以在终端执行这个命令。

$ stack test --dump-logs --fast --file-watch

该命令的执行情况会像下面这样:

workflow_1

优点:

  • 非常容易上手
  • 对有少量文件的项目非常有用
  • 保存文件后自动检测变化
  • 每次编译成功后,你可以使用--exec 参数运行另一条命令。
  • 可与任何源代码编辑器一起使用

缺点:

  • 当在一个有许多文件和依赖关系的项目上工作时,反馈回路很慢,因为你的工作流程在每次文件变化时都要经过编译和链接源。
  • 它没有提供一种简单的方法来与正在进行的代码进行交互。

通过GHCi的REPL驱动开发

这个工作流程允许开发人员交互式地玩弄Haskell代码,在这个特定的例子中,我们使用Stack来运行GHCi(因为它提供了一些实用程序,可以为我们自动加载项目的所有源代码,用于特定的目标),但你也可以用ghci 程序来运行它。当使用GHCi时,代码修改的结果可以很快看到,因为你的工具集不需要重新编译/链接整个项目,只需要修改的文件。

你可以通过在终端执行以下命令在你的堆栈项目中运行GHCi REPL。

$ stack repl

当使用stack repl ,工作流程看起来是这样的:

workflow_2

注意,每当我们改变一个文件时,我们需要执行:reload 命令来获得最新的改变,然后执行:main 来运行主程序,在这种情况下,主程序是一个测试套件,因此我们可以从REPL中运行测试套件。

优点。

  • 相当快的反馈循环,特别是在大型项目上
  • 可与任何源代码编辑器一起使用
  • REPL允许你运行你正在开发的功能,并与它们进行交互,而不需要编译一个程序

缺点。

  • 它不会在你修改文件时立即重新加载和运行你的应用程序
  • 运行程序的性能不如你编译二进制文件时好

用ghcid自动重新加载GHCi REPL

ghcid是一个由Neil Mitchell开发的惊人的工具。这个工具是之前讨论的第一种和第二种方法的结合。它在你的应用程序中运行一个REPL环境,并在你保存你的源代码文件的变化时,迅速重新加载(也可以选择运行)你的程序。要开始使用,你需要安装ghcid,然后在你的终端运行类似以下的命令。

$ ghcid --command "stack repl" --test ":main"

当使用ghcid时,它看起来像下面这样:

workflow_3

上面的命令是在REPL环境中加载项目的测试目标,对于文件中发生的每一个变化,它都在其REPL环境中执行:main 命令。

优点:

  • 最快的反馈循环
  • 适用于任何源代码
  • 允许修改测试命令,以便在文件变化时运行不同的东西(需要重新启动该过程)

缺点:

  • 你不再能够与源代码互动;它只验证代码的编译,并运行测试命令
  • 如果在 "测试命令 "参数上运行一个长期存在的应用程序,它的行为有点奇怪(例如,标准输出会丢失)。

Emacs + Intero开发

最后,我们要谈的是一个非常强大的工作流程。Intero允许你在编辑器内运行Haskell REPL,这本身就允许你从它那里收集信息,以增强你的代码编辑体验;它还允许你在REPL中快速重新加载你正在处理的模块,只需一个键绑定即可。这个工作流程与GHCi的工作流程非常相似,但有一个额外的好处,就是将REPL嵌入到你的编辑器中。如果你是一个Emacs高手,你可能会在你的Emacs编辑器中获得ghcid提供的所有功能。下面是一个使用intero的例子。

workflow_4_1

有了足够的使用emacs lisp的经验,你可以扩展你的编辑器,以支持像ghcid那样的自动重新加载和执行命令。在这个例子中,我们创建了一个emacs钩子,当我们在编辑器中保存文件时,它会自动为我们运行重新加载。

workflow_4_2

优点:

  • 最快的反馈循环(如果你使用emacs的话)
  • REPL允许你运行你正在开发的功能,并与它们进行交互,而不必编译一个程序
  • 与emacs无缝集成(增强了编码体验)

缺点:

  • 依附于一个特定的编辑器

总结

以上是我们在FP Complete中开发Haskell的四种主要方式,如果你已经使用了其中一种方式,但没有使用其他方式;我们鼓励你走出去,离开舒适区,尝试一种新的方式,你可能会发现它大大改善你的工作流程。你是否有另一个我们没有提到的、你很有成效的工作流程?请在评论中告诉我们。