如何 return 在 OCaml 的函数中作废?

How to return void in a function in OCaml?

简单的例子:我有一些函数,我需要调用它们,修改一个结构,只在一个函数中。使用这些简单的函数,任务可以不使用 void 的方式完成,但在其他任务中您必须使用 void。所以,你可以做什么?

type player = { mutable name : string; mutable points : int } ;;

let putname brad = match brad with
  { name = x; points = y } -> { name = brad; points = y } ;;

let putpoint guy score = match guy with
  { name = x; points = y } -> { name = x; points = score } ;;

let loosers listplayer guy = guy :: listplayer ;;

问题来了 - 我该如何做下一个功能?

let someoneloses guy = void

guy = putpoint guy 0 ;;
listplayer = loosers (listplayer guy) ;;

由于您使用的是可变数据,因此您只需直接分配值即可。

let p = {name = "me";points=0};;
let update x = x.name <- "you";
x.points <- 3;;

update p ;;

鉴于您使用的名称 "void" 我假设您更熟悉 C(或 C++)。在 OCaml 中,等价于 "void"(无值类型的名称)是 "unit"。但是还有另一个区别:虽然在 C 中语法非常复杂,它没有值的构造(例如,您可以 "return a_value;" 或 "return;",关键字的两个不同但在语法上有效的用例"return"), 在 OCaml 中语法更简单并且总是需要一个值。所以我们有一个 "nothing" 的符号,写成“()”。 所以,OCaml 相当于 C:

void do_nothing(void) { return; }

写成:

let do_nothing () = ()

(请注意,一旦掌握了“()”技巧,OCaml 语法将变得更加简单易懂)。

现在希望这更清楚了,回到你的问题。

一个 return 什么都没有的函数是一个 return "()" 的函数,或者是显式的(如上面的 "do_nothing"),或者是因为它以具有 " ()”作为其价值。例如,一个作业(告诉我你会喜欢作业),例如:

let putpoint guy score = guy.points <- score

现在回到你的问题。您似乎正在做某种游戏,其中玩家表示为可变记录,并且随着游戏的发展,一些函数会修改这些记录。您不需要为此使用模式匹配。实际上,上面的 "putpoint" 之类的功能可能就是您想要的。但是你需要在你的程序中有更多的状态:例如松手列表可能会引用你修改的列表等。

这是 OCaml 的 "imperative" 一面,但还有另一面,通常被认为更优雅,尽管通常通常较慢(但不是针对此技术优化的函数式语言),包括避免改变状态(改变事物的价值),而是使用函数仅仅取值和 returning 值。像这样实现,一个玩家将被表示为一个不可变的记录,并且每个扮演用户的函数将采用 "old user" 和 return 和 "new user",松散者列表也是如此,等等。实际上,整个游戏状态将表示为一个很大的值,您的程序的 "main loop" 会根据先前的值以及可能的时间和用户输入来计算 "new state" 和 return它。

玩得开心!

另外,你的问题与ocaml-batteries无关。