2012-09-27 12 views
5

Sono bloccato in un ciclo infinito in questa funzione:Bloccato in un ciclo infinito in una funzione

let rec showGoatDoorSupport(userChoice, otherGuess, aGame) =          
    if((userChoice != otherGuess) && (List.nth aGame otherGuess == "goat")) then otherGuess 
    else showGoatDoorSupport(userChoice, (Random.int 3), aGame);; 

Ed ecco come sto chiamando la funzione:

showGoatDoorSupport(1, 2, ["goat"; "goat"; "car"]);    

Nella prima condizione nella funzione, confronto i primi 2 parametri di input (1 e 2) se sono diversi, e se l'elemento nella lista all'indice "otherGuess" non è uguale a "goat", voglio restituire quell'altroGuess.

Altrimenti, voglio eseguire nuovamente la funzione con un numero casuale compreso tra 0 e 2 come secondo parametro di ingresso.

Il punto è continuare a provare a eseguire la funzione fino a quando il secondo parametro non è uguale al primo, e quello slot nell'elenco non è "goat", quindi restituire il numero di slot.

+1

sembra come 'c' abitudini di programmazione –

risposta

8

Non utilizzare ==, verifica l'uguaglianza fisica. Utilizzare =. Due stringhe diverse non saranno mai fisicamente uguali, anche se contengono la stessa sequenza di caratteri. (Questo è necessario, perché le stringhe sono mutabili in OCaml.)

$ ocaml 
     OCaml version 4.00.0 

# "abc" == "abc";; 
- : bool = false 
# "abc" = "abc";; 
- : bool = true 
+0

Impressionante:) Sei un maestro Ocaml! –

+0

Grazie, anche se in realtà sono solo un umile praticante. Ὁ βίος βραχύς, ἡ δὲ τέχνη μακρή - La vita è breve, il mestiere è lungo. –

+4

Lungo la stessa riga, '! =' Non dovrebbe essere usato qui, l'operatore di differenza strutturale è '<>' - sebbene non faccia molta differenza sugli interi. – gasche

1

altro per farlo è quello di utilizzare il String.compare. Un esempio:

if String.compare str1 str2 = 0 then (* case equal *) 
else (* case not equal *) 
+0

non esiste tale funzione in stdlib, probabilmente intendevi 'String.compare' – ygrek

+0

sì, grazie;) –

Problemi correlati