我是功能性编程的新手,需要制作一个简单的纸牌游戏,但在使用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
答案 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
。那么,当你写newdeck
来let f x = let a = 3 in x + a
let y = a
来自何处?
这就像写作
a
您是否同意f
本地newdeck
?如果您同意,则模式匹配的第一个分支的{{1}}是本地的。{/ p>