我对我的 Haskell 有点生疏了,我希望重新开始。我喜欢 F# 的一件事是与 Visual Studio 集成的 F# Interactive shell:我几乎可以评估任何东西(包括函数和类定义)并将 F# 用作 shell。Haskell 中是否有等价物?当我使用 时ghci
,我无法评估函数定义。你如何解决这个问题?
我目前的首选设置是使用带有 haskell 模式的 Emacs 并打开交互式 ghi 解释器。但是,有没有办法只评估文件的区域?
我对我的 Haskell 有点生疏了,我希望重新开始。我喜欢 F# 的一件事是与 Visual Studio 集成的 F# Interactive shell:我几乎可以评估任何东西(包括函数和类定义)并将 F# 用作 shell。Haskell 中是否有等价物?当我使用 时ghci
,我无法评估函数定义。你如何解决这个问题?
我目前的首选设置是使用带有 haskell 模式的 Emacs 并打开交互式 ghi 解释器。但是,有没有办法只评估文件的区域?
你可以使用'let'定义一个函数:
$ ghci
Prelude> let double n = n + n
Prelude> double 42
84
另外,我不太推荐这个,因为 (A) 我写了它,并且 (B) 它非常未开发,但是Halp在 Emacs 中很方便——它有点像集成到源代码中的 Haskell 代码的电子表格-代码缓冲区。您可以拥有一组您感兴趣的表达式,并通过一次按键查看它们的所有值如何根据自上次重新评估以来的编辑而变化。
正如您所观察到的,GHCi 的功能相当有限 --- 简短的函数或表达式在命令行中很容易做到。对于其余部分,我发现自己正在加载模块。困难之一是Haskell 在使用前没有定义,因此通常很难从文件中提取有意义的片段。我通常会发现自己定义小模块并加载和重新加载它们。互动体验绝对不如人们想象的那么好。
Emacs 的 Haskell 模式提供了与解释器一起工作的功能。因此,如果您想从您编辑的模块中运行某些功能,您可以使用 Cc Cl 将当前模块加载到 ghci(或另一个 haskell 交互式)并切换到交互式缓冲区并在那里执行一些命令
ghci 提供了一些特殊的语法来做这样的事情。用于let
函数定义。但是,在GHC FAQ中指出,复杂功能可能会很棘手,通常首选从文件加载。如果您使用诸如 Emacs 之类的东西,可以轻松集成源文件和 ghci 进程,那么这不是问题,因为您可以通过击键将定义加载到解释器中。
使用 O'Caml 和 F#,定义从文件顶部向下进行。但是,在 Haskell 中,文件中前面定义的类型或函数可以引用该文件后面的类型或函数。所以在 Haskell 中,一个模块需要一次编译。交互式循环与一次性编译不兼容。
Flymake 与 Emacs Haskell Mode 2.8 结合使用效果非常好,您可以立即得到类型检查器的响应。在我看来,这更具交互性。