2017-08-31 136 views
3

使用ghci,我有时会使用多行模式输入定义(如interactive-evaluation documentation中所述)。如何在ghci的多行模式下编辑之前的行?

例如,

> :{ 
Prelude| sumToN :: (Eq a, Num a) => a -> a 
Prelude| sumToN n 
Prelude| | signum n /= 1 = 0 
Prelude| | otherwise = 1 + sumToN (n-1) 
Prelude| :} 
> 

当使用这种多行输入模式,我偶尔会意识到,我在输入了一个错误的前一行。例如,在此代码中,我意外键入了A而不是a

> :{ 
Prelude| sumToN :: (Eq a, Num a) => a -> A 
Prelude| 

要纠正错误,我需要编辑上一行。但是,我找不到任何回头编辑上一行的方法。相反,I ^C退出多线模式并重新开始,必要时重复,直到我逐行输入整个定义而没有错误。

有什么方法可以编辑ghci的多行模式中的上一行,而无需再次输入所有行?

+0

你不能 - 只需将你的代码输入到一个文件并加载该文件。 – user2407038

+1

如果多行模式进入真正的编辑模式,我会很高兴,其中1)您仍然可以看到上面的行,2)您可以像普通编辑器一样在屏幕的底部自由移动。唉,事实并非如此。 – chi

回答

1

编号GHCi使用Haskeline,它只能在每行的基础上工作(并且不提供C-x C-e作为GNU Bash)。基本上,GHCi只能通过a queue of lines工作,其中使用Haskeline's getInputLine

所以:{:}只需要你的代码,在你的行之间加"\n",然后“通过解释器运行它”。不幸的是,没有可以编辑的行缓冲区。你所能做的就是放弃C-c,然后重试。