在VS Code中调试haskell

问题描述 投票:4回答:1

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

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

do
  someValue <- getLine

一旦调试器到达此行,它就会停止,我无法弄清楚如何将参数传递给程序。我猜它是在调试控制台的某个地方,但看起来提示仅用于驱动调试器。

我确信我错过了一些非常简单的事情 - 这是我第一次尝试用Haskell进行调整,而且我也是VS Code的新手。

haskell visual-studio-code
1个回答
4
投票

如存储库中所述 - You can't use STD[IN|OUT] methods; 像putStrLn这样的东西将被忽略,但IN方法(例如getLine)将被卡住;

对于没有STD[IN|OUT]方法的函数你可以使用F10 - select函数并发送params(例如[1,2,3]用于发送列表或"str"用于发送字符串):enter image description here

使用F5您可以从launch.json运行以前的配置或配置:

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

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

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

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

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

enter image description here

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

例如,你有一个程序:

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

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

enter image description here

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

© www.soinside.com 2019 - 2024. All rights reserved.