2012-09-27 23 views
5

estoy atascado en un bucle infinito en esta función:Atrapado en un bucle infinito en una función

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

Y así es como llamo a la función:

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

En el primer Condición en la función, comparo los primeros 2 parámetros de entrada (1 y 2) si son diferentes, y si el elemento en la lista en el índice "otherGuess" no es igual a "goat", quiero devolver ese otroGuess.

De lo contrario, quiero ejecutar la función nuevamente con un número aleatorio entre 0-2 como el segundo parámetro de entrada.

El punto es seguir intentando ejecutar la función hasta que el segundo parámetro no sea igual al primero, y esa ranura en la Lista no sea "caprina", luego devuelva ese número de ranura.

+1

parece 'hábitos de programación C ' –

Respuesta

8

No use ==, comprueba la igualdad física. Use =. Dos cadenas diferentes nunca serán físicamente iguales, incluso si contienen la misma secuencia de caracteres. (Esto es necesario, porque las cadenas son mutables en OCaml.)

$ ocaml 
     OCaml version 4.00.0 

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

impresionantes:) Usted es un maestro Ocaml! –

+0

Gracias, aunque en realidad solo soy un practicante humilde. Ὁ βίος βραχύς, ἡ δὲ τέχνη μακρή - La vida es corta, el arte es largo. –

+4

A lo largo de la misma línea, '! =' No se debe usar aquí, el operador de diferencia estructural es '<>' - aunque no hace mucha diferencia en enteros. – gasche

1

Otra de hacerlo es utilizar el String.compare. Un ejemplo:

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

no hay tal función en stdlib, probablemente significó 'String.compare' – ygrek

+0

sí, gracias;) –

Cuestiones relacionadas