在VS Code中调试haskell

use*_*821 5 haskell visual-studio-code

我正在尝试使用phoityne-vscode插件在VS Code中调试一个简单的Haskell应用程序。我设法配置了插件并运行了应用程序-我可以看到断点。

问题是无法弄清楚如何与正在运行的应用程序进行交互。我在一行中希望有用户输入

do
  someValue <- getLine
Run Code Online (Sandbox Code Playgroud)

调试器到达此行后,它将停止,并且我无法弄清楚如何将参数传递给程序。我猜想它在调试控制台中的某个位置,但看起来提示仅用于驱动调试器。

我确信我缺少一些非常简单的东西-这是我第一次尝试使用Haskell进行调音,而且我还是VS Code的新手。

use*_*966 9

如存储库中所述 -您不能使用STD[IN|OUT]方法
类似的东西putStrLn会被忽略,但IN方法(getLine例如)会卡住;

对于没有STD[IN|OUT]方法的函数,您可以使用F10- 选择函数并发送参数(例如[1,2,3]用于发送列表或"str"发送字符串): 在此处输入图片说明

随着F5您可以运行以前的配置或配置launch.json

  • mainArgs- params,你可以用getArgs(cmd params for your programm);
  • startupFunc - 将首先调用的函数的名称;
  • startupArgs- 第一个函数的参数(例如"startupArgs": "666"将与 相同<F10> -> 666 -> <Enter>
  • stopOnEntry - 在函数开始时启用/禁用断点的布尔参数;

另外,如果我理解正确,F10将重写startupFuncstartupArgs

我真的是haskell的新手,所以当我可以在调试控制台中获得常量的值时我有点困惑,有时我有:

[DAP][ERROR] 在 runStmt 时发生错误。
变量不在范围内:<...>

同样看起来像wherelet块被忽略:D
使用watch面板以便更好地理解何时可以使用一些常量:

在此处输入图片说明

如果要调试输入\输出方法,可以使用ghci调试命令(:h-Commands for debugging块);

例如,您有一个程序:

89| test :: IO ()
90| test = do
91|   a <- getLine
92|   b <- getLine
93|   putStrLn $ a ++ b
Run Code Online (Sandbox Code Playgroud)

用于:break 93在第93行添加断点;
然后在解释器中运行你的程序:test;
输入值。现在您将停在putStrLn $ a ++ b- 如果您输入ab在控制台中 - 您将获得这些常量的值;
然后:step为评估++:stepputStrLn

在此处输入图片说明

我希望它会对某人有所帮助;