用于纸牌游戏的OCaml rec功能

时间:2016-05-06 19:31:00

标签: recursion functional-programming ocaml

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

假设我有一个包含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

2 个答案:

答案 0 :(得分:1)

我认为你的当前问题是你有:

let i = read_int

但你需要

let i = read_int ()

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

浏览代码的其余部分,我没有看到使用值t。我怀疑还需要做更多的工作才能查看球员名单。

答案 1 :(得分:0)

实际上,你的代码很奇怪。让我向你解释一下原因:

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。那么,当你写newdecklet f x = let a = 3 in x + a let y = a 来自何处?

这就像写作

a

您是否同意f本地newdeck?如果您同意,则模式匹配的第一个分支的{{1}}是本地的。{/ p>