在Emacs中使用sml-mode,我已经能够使用C-c C-b将我的缓冲区内容直接发送到一个较低的SML进程。现在我只想对Haskell做同样的事情。Haskell-mode似乎不支持这一点,所以我想知道:使用Emacs和Haskell做这件事的正确方法是什么?
在学习SML时,我几乎不间断地使用C-c C-b来轻松地评估我的程序,立即看到赋值的结果等。但是如果我在haskell模式下对包含两行let foo = "foo"和let bar = "bar"的已保存文件使用C-c C-l -我会得到"parse error (possibly incorrect indentation)"
发布于 2011-10-22 03:37:30
我认为您正在犯一个常见的新手错误,混淆了可以在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: parse error )。这样做的原因是,ghci中的repl在IO monad中运行,因此您向ghci中写入的任何内容都必须使用do表示法来完成。我只能建议您阅读使用GHCi用户指南中的Interactive evaluation at the prompt。
sml模式下的C-c C-b与haskell模式下的C-c C-l是完全相同的,至少在概念上是这样的。我不太了解haskell模式的内部原理,但在sml模式下,C-c C-b会在解释器中执行一些sml代码,通常是use(...)函数。在haskell模式下,它似乎只是执行:load "..." ghci命令。
发布于 2011-10-20 21:29:32
你不能用ghci (或hugs)来做到这一点,原因很简单,你不能用ghci (或hugs)来写顶层定义。因此,即使您手动将文件的内容粘贴到ghci中,也只能得到一个语法错误。
因此,使用C-c、C-l加载文件是您能做的最好的事情。
https://stackoverflow.com/questions/7836634
复制相似问题