2011-09-23 13 views
9

Hay códigos como¿Qué significa "let() =" en Ocaml?

let() = print_string "something" in 
fn 

en algunos códigos OCaml.

¿Qué significa esto? ¿Hay un significado especial en "()"? o ¿Es mismo significado que

print_string "something"; 
fn 
+0

Es probable que desee utilizar 'let _ = ...' exclusivamente, sin embargo, ya que funcionará para la mayoría si no todas las expresiones. –

+1

'let _ = ...', o la coincidencia de patrones frágiles, no es absolutamente recomendable. Es más o menos equivalente a dar un dedo medio al sistema de tipo. – nlucaroni

+0

Estoy de acuerdo con nlucaroni. si quieres 'let _ = ... in ...', entonces probablemente quieras 'ignorar (...); ... ' – newacct

Respuesta

11

No hay nada especial acerca de () en este let expresión, que es sólo un patrón. Todos let expresiones parecen letpattern=expressioninother-expression. Aquí el patrón siempre coincidirá, porque print_string devuelve unit, y () es el único valor de ese tipo. De esta forma, es solo otra forma de combinar dos expresiones en una cuando la primera es realmente más una afirmación (devuelve unit).

Así que tienes razón, la construcción tiene más o menos el mismo significado que usar el operador ;. La única diferencia real está en la precedencia. Si, por ejemplo, se escribe

if x < 3 then 
    print_string "something"; 
    f x 

, se verá que es f xsiempre llamada. La precedencia de ; es demasiado baja para extraer la segunda expresión bajo el control de if. Esa es la razón por la que muchas personas (incluyéndome a mí) adquieren el hábito de usar let() =expression. Si se escribe lo anterior como

if x < 3 then 
    let() = print_string "something" 
    in f x 

la f x sólo se invoca cuando x es inferior a 3, que suele ser lo que quiero. En esencia, la precedencia de let es mucho mayor que ;.

Por supuesto, hay otras formas de obtener este efecto, pero lo bueno de usar let es que no tiene que agregar nada más adelante en el código (como un paréntesis de cierre o end). Si está agregando el print_string como una declaración de depuración, esta es una forma práctica de mantener los cambios locales en el mismo lugar.

+0

Como otro ejemplo de sorprendente programa permitido por la sintaxis, si solo quiere ejecutar' f() 'cuando se cumplen las leyes usuales de la aritmética, puede escribir' let 4 = 2 + 2 en f(); ; ' –

3

respuesta de Jeffrey es absolutamente correcto, pero un punto más:

si se escribe

fx "something"; 
fn 

Y en mal estado el tipo de resultado de fx "something" el compilador emitirá una advertencia, que podría perderse durante Compilacion. Por otro lado, si usted escribe:

let() = fx "something" in 
fn 

El compilador tipo de comprobación de que el resultado de fx "something" puede ser igualada contra (), es decir, que en realidad es de tipo unit. Por lo tanto, si se equivoca, se produce un error, que generalmente es más seguro.

también existe la posibilidad de escribir

let _ = fx "something" in 
fn 

que sólo obtendrá el efecto de precedencia que Jeffrey menciona, pero no hacer ninguna verificación de tipos, ya que _ puede ser comparada con valores de cualquier tipo.

+0

y el último es equivalente a' ignorar (fx "algo"); fn' en notación de punto y coma – newacct