gpt4 book ai didi

f# - 有没有办法使用 printf 在 F# interactive 中更新同一行?

转载 作者:行者123 更新时间:2023-12-02 01:05:35 24 4
gpt4 key购买 nike

大家好!

我在 Visual Studio Community 2017 中使用 F# 编写脚本。我正在处理大型数据集,我经常使用递归函数对其进行循环。为了大致了解这需要多长时间,我目前正在使用 printfn 打印当前迭代索引。虽然我猜这听起来(而且是)微不足道,但这里有一个例子:

let foo f bar maxIter =
let rec loop currentIter resultList=
if currentIter<maxIter then
printfn "current Iteration: %i" currentIter
loop (currentIter+1) ((f bar)::resultList)
else
List.rev resultList
loop 0 []

enter image description here

这确实使 fsi 窗口变得困惑,如果我在更大的函数中的不同步骤上另外打印其他字符串,则无法遵循。

我的问题如下:我能以某种方式用当前迭代号更新 fsi 中的一行吗?我试过使用 printf 和回车符:

printf "%i\r"

但这与使用 printfn 的结果相同。

预先感谢您的帮助!

编辑:正如该线程的评论者指出的那样,目前似乎无法在 VS FSI 中执行此操作。

最佳答案

可以通过设置光标位置来实现(独立的)迭代计数器:

let rec progress i : unit =
printf "%i" i
System.Threading.Thread.Sleep 1000
System.Console.SetCursorPosition(0, System.Console.CursorTop)
progress (i+1)

progress 0

注意 1:这将覆盖当前行上的任何内容,即其他日志输出将被覆盖,除非您实现某种同步手段或始终使用 printfn 除了进度。可以通过以下方式观察此行为:

open System
open System.Threading

let rec progress i p : unit =
printf "%s %i" p i
Thread.Sleep 1000
Console.SetCursorPosition(0, Console.CursorTop)
progress (i+1) p

Tasks.Task.Run(fun () -> progress 0 "t1")
Thread.Sleep 500
Tasks.Task.Run(fun () -> progress 0 "t2")

注意 2:由于 VS 的限制,这在 VisualStudio FSI 中不起作用。它确实适用于 VS 代码、控制台(编译为 EXE、运行 CMD 或 PowerShell)或使用非 VS FSI(在 Windows 10、VS 15.5.1 上测试)。

关于f# - 有没有办法使用 printf 在 F# interactive 中更新同一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47675136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com