2011-10-08 13 views
6

En el nivel superior ocaml (versión 3.11.2), esta simple expresión me da un error:palabra clave ocaml null: ¿una vez pero no más?

# let a = [] in if null a then 0 else 1;; 
Error: Unbound value null 

acabo de comenzar el aprendizaje de la ocaml oreilly book, que parece utilizar nulo como una palabra clave con frecuencia - para ejemplo, parte superior de la página 32:

# let rec size a_list = 
    if null a_list then 0 
    else 1 + (size (List.tl a_list));; 

Me da vergüenza hacer una pregunta tan obviamente googleable aquí. Pero después de mucho Google, vine con las manos vacías. Así que estoy tan abierto a las sugerencias de búsqueda de Google como a las respuestas directas. (Intentos de Google fallidos: [ocaml "Error: valor sin vincular nulo"] [palabra clave nulo ocaml] [ocaml changelog null] [ocaml change null]).

Pregunta: ¿era null una vez una palabra clave ocaml, pero ya no? ¿O instalé ocaml incorrecto o escribo mal algo?

Por supuesto puedo reemplazar cada aparición de "nulo" con "[]" en el código, pero me sorprende que una copia literal del código de un libro me da un error tan temprano. ¿Este libro está lleno de otros errores? Creo que fue escrito con ocaml 2.04 en mente; es eso demasiado viejo? Lo elegí porque me gustó TOC y la disponibilidad gratuita en línea. Aparte de este error nulo (que estoy aún más dispuesto a culpar a mí mismo que a los autores), las explicaciones son agradables y estoy esperando la discusión de la mezcla funcional del estilo imperativo & (mente expansiva para mí, como alguien solo familiarizado con c/C++).

+0

[Esta pregunta] (http://stackoverflow.com/questions/4013654/differences-between-ocaml-2-and-3) aborda los cambios entre la versión 2 y 3, y enlaces a una lista de cambios; ninguno de estos menciona la cosa nula. De hecho, el PO menciona el libro oreilly que he vinculado en mi Q y lo recomienda alguien que responde la pregunta. Probablemente voy a comentar sobre ese hilo después de descubrir qué está pasando aquí. – ImAlsoGreg

+2

No sabía que 'null' era una palabra clave. ¿Estás seguro de que no es solo una función que han definido en algún momento? AFAIK, no existe tal noción de 'null' en un verdadero lenguaje funcional. Probablemente lo más cercano sería la unidad ('()'). –

+0

¡Tienes razón! Busqué mi pdf para "dejar null =" y, por supuesto, es algo definido en el libro. Muchas gracias por aclarar esto. Ahora la meta-pregunta es: ¿debería dejarse la pregunta en su lugar para que la gente cometa el mismo error tonto que yo más tarde? – ImAlsoGreg

Respuesta

9

nula se define en el libro en la página 31. Es una función normal que puede ser definida por:

let null l = (l = []) 

Esta nomenclatura es más o menos basado en Lisp, donde NIL es una lista vacía (también escrito as()) y NULL es un predicado (una función que devuelve verdadero o falso), exactamente como null arriba.

2

OCaml proporciona una potente Pattern Matching, lo que le permite definir la función más legible:

let rec size a_list = match a_list with 
| [] -> 0 
| _ :: tl -> 1 + (size tl) 

Como coincidencia de patrones se realiza a menudo en el último argumento, una notación especial está disponible:

let rec size = function 
| [] -> 0 
| _ :: tl -> 1 + (size tl) 

null podría definirse más corto usando (=) (es decir, la prueba de igualdad como una función normal/prefijo):

let null = (=) [] 
Cuestiones relacionadas