2010-08-08 13 views
7

Hay esta función de índice en "Programación de Erlang":¿Por qué se usa "cuándo" en esta función?

index(0, [X|_]) -> X; 
index(N, [_|Xs]) when N>0 -> index(N-1, Xs) 

no es la guardia "cuando N> 0" superfluo debido a la coincidencia de patrones? El índice de llamadas (0, Lista) nunca terminará en la segunda cláusula, así que N siempre será> 0. ¿O estoy totalmente equivocado aquí?

+0

no sé Erlang (solo OCaml) así que lo dejo como un comentario: ¿Qué patrón coincidiría con N == - 1 Mi conjetura sería el segundo (si no fuera por el guardia) –

+0

Rune FS , Ese fue mi primer pensamiento también, pero el índice (-1, [1,2,3]) da como resultado "** error de excepción: ninguna prueba de coincidencia de cláusula de función: índice (-1, [1,2,3])" –

+0

pero si quita el protector, ¿eso no concuerda entonces? –

Respuesta

12

La función funciona correctamente para N> = 0. Sin un protector, para N < 0, atravesaría toda la lista:

índice (-2, [1,2,3]) -> índice (-3, [2,3]) -> ... -> índice (-5, []) -> error.

Eso no es un gran problema, solo es posible que obtenga una excepción confusa. En idiomas con listas infinitas (Haskell, Ocaml), olvidarse de esa guardia podría llevar a un bucle infinito: índice (-1, [0,0,0 ..]).

6

La cláusula when protege contra los índices negativos (edite: vea los comentarios a la pregunta original;).

5

También proporciona un código más claro como usted dice explícitamente cuando esta cláusula es válida, no solo por defecto. Sí, sé que en algunos (muchos) casos esto no es posible hacerlo correctamente, ya que la prueba puede volverse muy compleja o que desee algún tipo de caso predeterminado. Pero no aquí.

Cuestiones relacionadas