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