【问题标题】:OCaml rec function for a card game纸牌游戏的 OCaml rec 功能
【发布时间】:2016-09-01 23:34:37
【问题描述】:

我是功能编程的新手,需要制作一个简单的纸牌游戏,但在录制功能方面遇到了麻烦。

假设我有一个包含 5 个玩家的列表。现在我用玩家当前的手牌为每一轮玩家打印一个菜单,然后玩家丢下一张牌并抽一张新牌。

我需要一直跑到牌堆用完为止。

这是我的代码:

let rec round deck players =
  match deck with
    | [] -> ()
    | h::t -> (match players with
                  | x::xs -> print_mazo deck;
                    print_play x;
                    let i = read_int () in
                    let (newhand, carta) = drop x.mano i in
                    let (newdeck, newhand2) = draw deck newhand 1 in
                    print_ronda x carta;
                    round newdeck xs
                  | [] -> round newdeck players 
            )

我收到了这个错误:

Error: Unbound value newdeck

【问题讨论】:

  • 看起来问题与read_int 一致:应该是read_int ()
  • (1) 最好有一个实际编译的最小化完整示例。 (2) 至少你应该标记出错误发生的那一行。
  • 你不能一直改变你的问题。它使旧答案变得荒谬。
  • 我同意@JeffreyScofield,直到我看了你编辑的内​​容,我才明白他的回答:-D
  • 很抱歉第一次使用 Stakoverflow,现在我知道它是如何工作的了。感谢大家的帮助。

标签: recursion functional-programming ocaml


【解决方案1】:

实际上,您的代码很奇怪。让我向你解释为什么:

let rec round deck players =
match deck with
  | [] -> ()
  | h::t -> (match players with
              | x::xs -> (* Some code *)
                let (newdeck, newhand2) = draw deck newhand 1 in
                round newdeck xs (* good recursive call *)
              | [] -> round newdeck players (* bad recursive call *)
        )

为什么是 bad recursive call ?因为您在模式匹配的第一个分支中声明了newdeck,但在第二个分支中没有。那么,当你写| [] -> round newdeck players 时,newdeck 是从哪里来的?

这就像写作

let f x = let a = 3 in x + a
let y = a

您是否同意 af 的本地地址这一事实?如果您同意,则与您的 newdeck 位于模式匹配的第一个分支的本地相同。

【讨论】:

  • 哦,我明白了,我需要一种方法来在最终模式匹配中使用我修改过的套牌
  • 实际上,如果您仔细查看代码,如果玩家列表为空,您的newdeck 等于参数deck,因为对round 的递归调用总是完成在newdeck.
【解决方案2】:

我认为您的直接问题是:

let i = read_int

但你需要

let i = read_int ()

read_int 本身就是一个函数,在 OCaml(以及任何 FP 语言)中是一个相当普通的值。因此,将i 绑定到该值并不是错误。但是,编译器注意到该值没有正确的类型,即int。你想真正调用这个函数;即,您需要将其应用于输入值。对于read_int,它始终采用相同的输入值()

浏览您的其余代码,我看不到值 t 的任何用途。我怀疑还有一些工作要做才能查看玩家列表。

【讨论】:

    猜你喜欢
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多