如何在F#中添加递增计数器

5
我正在尝试完成汉诺塔游戏,但不知道如何添加计数器。这是我的代码:
open System

let disks = Int32.Parse(Console.ReadLine())

let rec hanoi num start finish =
  match num with
  | 0 -> [ ]
  | _ -> let temp = (6 - start - finish)
     (hanoi (num-1) start temp) @ [ start, finish ] @ (hanoi (num-1) temp finish)

[<EntryPoint>]
let main args =
  (hanoi disks 1 2) |> List.iter (fun pair -> match pair with
| a, b -> printf ": %A %A\n" a b)
  0

我想让它打印出类似于这样的东西。
1: 1 3
2: 1 2
3: 3 2
etc...

I'm aware that there is no formatting set for the

1:
2:
3:

第一部分。我知道正确的格式是什么。
"%A: %A %A\n" *with some counter here* a b

然而我不知道如何做到这一点。我在网上寻找答案,但没有找到任何有用的信息。如果有人能帮助我,我将不胜感激。

提前感谢您的帮助。


3
List.iteri函数将提供给你计数器。 - s952163
这与你的问题无关,但是当你学习这门语言时,你可能想看看使用.fsx文件和F# interactive - 你根本不需要编译代码,你可以在同一个窗口中进行调整和查看反馈。你可以通过高亮显示代码并按下alt-enter将代码发送到F# interactive中。 - Jake Lishman
1个回答

6

s952163的评论在这里是正确答案,但以下有更多解释。

List.iteri看起来与List.iter非常相似,唯一的区别是你的函数会有两个参数——计数器和列表元素。在这里,应该是这样的:

hanoi disks 1 2 |> List.iteri (fun i (a, b) -> printfn "%d: %d %d" i a b)
< p > < em >注意:我还提供了几种简化代码行的方式,包括:

  • 移除hanoi函数周围不必要的括号——管道操作符|>的优先级非常低,因此通常不需要括号来分隔其参数
  • 使用printfn而不是printf“...\n”——前者更受欢迎,因为它将使用正确的行结尾形式。在Windows上,这实际上是“\r\n”(但是当你写入控制台时,这并不重要)
  • 删除lambda函数中的模式匹配——你实际上没有进行模式匹配,因为元组(a,b)本身就是一个类型。你可以直接在函数调用中获取参数,并节省一些打字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接