在Emacs中使用sml-mode我已经能够使用C-c C-b
将我的缓冲区内容直接发送到较差的SML进程。现在我想只用Haskell做同样的事情。 Haskell模式似乎不支持这个,所以我想知道:用Emacs和Haskell来解决这个问题的正确方法是什么?
在学习SML时,我一直在使用C-c C-b
几乎不间断地轻松评估我的程序,立即看到分配值等的结果。但是如果我在haskell中使用C-c C-l
- 保存文件上的模式包含两行,let foo = "foo"
和let bar = "bar"
- 我得到"parse error (possibly incorrect indentation)"
答案 0 :(得分:9)
我认为你犯了一个常见的新手错误,混淆了你在ghci的repl中写的内容以及你在haskell源文件中写的内容。
所有sml解释器都是以这样的方式制作的:你可以在repl中写入任何顶级声明,换句话说:你可以在sml文件中写入任何内容,你可以写入sml解释器。因此,您可以将val foo = "bar"
写入文件并使用C-c C-b
加载文件,并允许您将val foo = "bar"
放入解释器。
另一方面,由于haskell如何工作,你可以将let foo = 42
写入ghci,但它不是有效的顶级声明,因此不能在haskell源文件中(由它自己)。另一方面,你可以在haskell源文件中使用id n = n
并使用C-c C-l
加载文件,但是你不能直接将它写入ghci(你会收到错误:: 1:6 :输入'='时解析错误。这样做的原因是ghci中的repl在IO monad中运行,因此你写入ghci的内容必须使用do符号来完成。我只能建议您阅读使用GHCi用户指南中的Interactive evaluation at the prompt。
C-c C-b
与haskell模式中的C-c C-l
完全相同,至少在概念上是这样。我对haskell-mode的内部结构知之甚少,但在sml-mode C-c C-b
中,在解释器中执行一些sml代码,通常是use(...)
函数。在haskell模式下,它似乎只是执行:load "..."
ghci命令
答案 1 :(得分:5)
你不能用ghci(或拥抱)这样做,原因很简单,你不能在ghci(或拥抱)中编写顶级定义。因此,即使您手动将文件的内容粘贴到ghci中,您所获得的只是语法错误。
因此,您可以使用C-c C-l加载文件。