2016-05-06 1 views
0

Я новичок в программировании и должен сделать легкую карточную игру, но у вас проблемы с rec funtion.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 
+0

похоже, что проблема находится в строке с 'read_int': она должна быть' read_int() ' –

+1

(1) Было бы неплохо иметь свернутый полный пример, который фактически компилируется. (2) И по крайней мере вы должны были пометить линию, где происходит ошибка. –

+3

Вы не можете изменять свой вопрос. Это делает старые ответы бессмысленными. –

ответ

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, являющимся локальным для первой ветви соответствия шаблонов.

+0

О, я вижу, мне нужен способ использовать мою модифицированную колоду в финальном согласии с patern. –

+0

Собственно, если вы посмотрите на свой код с вниманием, если список игроков пуст, ваш 'newdeck' будет равен параметру' колода', так как рекурсивный вызов 'round' всегда выполняется на' newdeck'. – Lhooq

1

Я думаю, ваша непосредственная проблема в том, что у вас есть:

let i = read_int 

но вам нужно

let i = read_int() 

read_int сам по себе является функцией, которая является довольно обычным значением в OCaml (и любом языке FP). Так что это не ошибка для привязки i к этому значению. Однако компилятор замечает, что значение не имеет нужного типа, а именно int. Вы хотите на самом деле позвонить функция; то есть вам необходимо применить его к входному значению. В случае read_int он всегда принимает одинаковое входное значение, ().

Снимая остальную часть кода, я не вижу никакого значения t. Я подозреваю, что есть еще одна работа, которую нужно сделать, чтобы пройти список игроков.

 Смежные вопросы

  • Нет связанных вопросов^_^