在 Emacs 中使用 sml-mode 我已经能够使用以下命令将缓冲区内容直接发送到较差的 SML 进程C-c C-b
。现在我只想用 Haskell 做同样的事情。 Haskell 模式似乎不支持这一点,所以我想知道:使用 Emacs 和 Haskell 解决这个问题的正确方法是什么?
在学习SML时我一直在使用C-c C-b
几乎不间断地轻松评估我的程序,立即看到赋值等的结果。但是如果我使用C-c C-l
在 haskell 模式下,在包含两行的已保存文件上,let foo = "foo"
and let bar = "bar"
- 我明白了"parse error (possibly incorrect indentation)"
我认为你犯了一个常见的菜鸟错误,混淆了你可以在 ghci 的 repl 中编写的内容和你在 haskell 源文件中编写的内容。
所有 sml 解释器都是以这样的方式制作的,您可以将任何顶级声明写入 repl,或者换句话说:您可以在 sml 文件中写入的任何内容,都可以写入 sml 解释器。因此你可以写val foo = "bar"
进入文件并使用C-c C-b
加载文件,您可以直接输入val foo = "bar"
进入口译员。
另一方面,由于 haskell 的工作方式,你可以写let foo = 42
进入 ghci,但是它不是一个有效的顶级声明,因此它不能位于 haskell 源文件中(就其本身而言)。另一方面你可以拥有id n = n
在 haskell 源文件中并使用C-c C-l
加载文件,但是您不能将其直接写入 ghci (您将收到错误::1:6:输入'='时解析错误)。原因是 ghci 中的 repl 在 IO monad 中运行,因此写入 ghci 的内容必须使用 do 表示法来完成。我只能建议你阅读即时互动评估 http://www.haskell.org/ghc/docs/latest/html/users_guide/interactive-evaluation.html来自使用 GHCi 用户指南。
C-c C-b
在 sml 模式下与C-c C-l
在 Haskell 模式下,至少在概念上是这样。我对 haskell 模式的内部了解不多,但在 sml 模式下C-c C-b
在解释器中执行一些 sml 代码,通常是use(...)
功能。在 haskell 模式下,它似乎只是执行:load "..."
ghci命令
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)