【问题标题】:How to return void in a function in OCaml?如何在 OCaml 的函数中返回 void?
【发布时间】:2016-05-03 18:42:47
【问题描述】:

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

【问题讨论】:

  • 很不清楚...你能解释一下someoneloses这个函数应该做什么吗?
  • OCaml 中没有void。所以很难理解你在问什么。我怀疑您试图假装 OCaml 与您已经知道的语言相同,这不太可能奏效。您需要按照自己的方式对待它。 OCaml 中有一个类型unit,其值为()。这有点像其他语言中的void。但我怀疑它会帮助你做你想做的事。
  • 谢谢,是的,我是 OCaml 的新手,我必须为我的大学做一份工作。是的,我正在尝试做一个不返回任何内容的函数或方法,无效。因为我必须在其他模块的一个函数中同时调用函数 putpoint 和函数松散。这个想法是这样的:在其他模块中,我有一个功能可以处理人们的争吵,打架 --->> if (peter lost) (putpoint peter 0 &&loosers listplayer peter).. 如果有的话,这个 lenguaje 不能这样做模块化(所以我做了某人丢失的功能)

标签: ocaml ocaml-batteries


【解决方案1】:

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

void do_nothing(void) { return; }

是这样写的:

let do_nothing () = ()

(请注意,一旦你掌握了“()”技巧,OCaml 语法就变得更简单、更容易理解了)。

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

什么都不返回的函数是一个返回“()”的函数,要么是显式的(如上面的“do_nothing”),要么是因为它以一个以“()”为值的表达式结尾。例如,一个作业(告诉我你会喜欢作业),例如:

let putpoint guy score = guy.points <- score

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

这是 OCaml 的“命令性”方面,但还有另一个方面,通常被认为更优雅,尽管通常通常较慢(但不是在为此技术优化的函数式语言中),包括避免改变状态(改变事物的值),而是使用仅取值和返回值的函数。像这样实现,玩家将被表示为一个不可变的记录,并且每个充当用户的函数都会接受一个“旧用户”并返回一个“新用户”,松手列表也是如此,依此类推。实际上,整个游戏状态将表示为一个很大的值,您的程序的“主循环”将在给定先前值以及可能的时间和用户输入的情况下计算“新状态”并返回它。

玩得开心!

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-28
      • 2017-02-23
      • 2012-09-30
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多