Loops 有没有办法使用函数式编程避免OCaml中的循环?

Loops 有没有办法使用函数式编程避免OCaml中的循环?,loops,functional-programming,ocaml,Loops,Functional Programming,Ocaml,我正在尝试编写一个纸牌游戏,在某个时候,用户被问到: “提交玩家姓名或退出以开始游戏” 因此,我需要问这个问题,直到用户提交“退出”,我被告知有一种不使用循环的方法可以做到这一点 到目前为止,我所拥有的只是: printf("Ingrese el nombre del jugador o EXIT para comenzar el juego");; print_newline;; let command = read_line;; 在那里我会使用一个循环: while (command &l

我正在尝试编写一个纸牌游戏,在某个时候,用户被问到:

“提交玩家姓名或退出以开始游戏”

因此,我需要问这个问题,直到用户提交“退出”,我被告知有一种不使用循环的方法可以做到这一点

到目前为止,我所拥有的只是:

printf("Ingrese el nombre del jugador o EXIT para comenzar el juego");;
print_newline;;
let command = read_line;;
在那里我会使用一个循环:

while (command <> "EXIT") do
while(命令“退出”)执行
但有人建议,在进行函数式编程时,这是不好的


非常感谢您。

只需使用一个递归函数,该函数在命令为“EXIT”时终止。

这里有一个函数,它从stdin中读取文本行,直到看到由单词EXIT(或文件结尾)组成的行:


让Jeffrey的回答更漂亮一点:

let rec read_until_exit () =
  match read_line () with
  | exception End_of_file -> ()
  | "EXIT" -> ()
  | s ->
    do_something_you_want_to_do_here_with_the_line s;
    read_until_exit ()

在这种情况下,当你没有得到“退出”时,它只会让函数继续运行,而你什么都不做?“()”是否意味着退出该函数?如何在最后添加另一行,我的意思是我希望函数在最后一个案例中也创建一个新的播放器是的,这个函数什么都不做。这只是一个例子。值
()
由函数返回,但没有什么特别之处。您可以让函数返回您喜欢的任意两个值(相同类型)。我将添加一条注释,显示您可以在函数中执行操作的位置。(作为旁白,我恭敬地建议您可能需要学习一门OCaml教程。您无法真正猜出自己学习一门新语言的方法。)妮特:我可以想象一些方法来让这段代码不那么难看,请参见下面我的答案。:)一点解释。此功能(带异常处理的混合模式匹配)从OCAML4.02开始就可用@JeffreyScofield实现了一个尾部递归版本,这就是它看起来有点复杂的原因。很好地解释了这一切。@AntonTrunov,这个版本仍然是尾部递归的。是的,我应该说@Jeffrey的版本实现了一个尾部递归版本,而没有使用这个相对较新的功能:)这个新功能很好,我以后会记得使用它!谢谢
let rec read_until_exit () =
  match read_line () with
  | exception End_of_file -> ()
  | "EXIT" -> ()
  | s ->
    do_something_you_want_to_do_here_with_the_line s;
    read_until_exit ()