如何在OCaml中的函数中返回void?

时间:2016-05-03 18:42:47

标签: ocaml ocaml-batteries

简单示例:我有一些函数,我需要全部调用它们来修改结构,只在一个函数中。通过这些简单的功能,可以以不使用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) ;;

2 个答案:

答案 0 :(得分:1)

鉴于您使用的名称" void"我假设您更熟悉C(或C ++)。在OCaml相当于" void" (没有值的类型的名称)是" unit"。但是有另一个不同之处:在C语言中,语法足够复杂,它没有值的构造(例如,你可以"返回a_value;"或" return;" ,关键字" return")的两个不同的但是语法上有效的用例,在OCaml中语法更简单并且总是需要一个值。因此,我们有一个符号"没有",这是精明的,但可能也很混乱,写得"()"。 所以,OCaml相当于C:

void do_nothing(void) { return; }

写道:

let do_nothing () = ()

(注意一旦你得到"()"技巧,OCaml语法如何更简单易懂。

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

一个不返回任何内容的函数是一个函数,它返回"()",显式地返回(" do_nothing"上面)或者因为它以一个带有&#34的表达式结束;()"作为它的价值。例如,一项任务(告诉我你喜欢的任务),例如:

let putpoint guy score = guy.points <- score

现在回到你的问题。你似乎正在做一些游戏,玩家代表可变记录,一些功能在游戏开发时修改这些记录。您无需使用模式匹配。实际上,诸如&#34; putpoint&#34;等功能以上可能是你想要的。但是你的程序中需要更多的状态:例如,松散的列表可能是对你修改的列表的引用等。

这是&#34;当务之急&#34; OCaml的一面,但是还有一个,通常被认为更优雅,虽然通常较慢(但不是在针对这种技术优化的函数式语言中),包括避免改变状态(改变事物的值)而是使用功能只是取值和返回值。像这样实现,玩家将被表示为不可变记录,并且代理用户的每个功能将使用旧用户&#34;并返回一个&#34;新用户&#34;,同样适用于松散者列表,依此类推。实际上,整个游戏状态将被表示为一个很大的值,即&#34;主循环&#34;如果给出之前的值,你的程序将会计算时间和用户输入,并计算出新状态&#34;并将其归还。

玩得开心!

此外,您的问题与ocaml-batteries无关。

答案 1 :(得分:0)

因为您使用的是可变数据,所以您只需要直接分配值。

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

update p ;;