La respuesta de Stringer, es, por supuesto correcto Pensé que podría ser útil aclarar cómo funciona esto, porque "()" en realidad no es una declaración vacía o un efecto secundario vacío ...
En F #, cada código válido es una expresión. Las construcciones como let
y match
consisten en algunas palabras clave, patrones y varias subexpresiones. El F # gramática para let
y match
se ve así:
<expr> ::= let <pattern> = <expr>
<expr>
::= match <expr> with
| <pat> -> <expr>
Esto significa que el cuerpo de let
o el cuerpo de la cláusula de match
debe haber alguna expresión. Puede ser una llamada a función como ignore 0
o puede tener algún valor. En su caso, debe ser una expresión del tipo unit
, porque printfn ".."
también es del tipo unit
.
El tipo unit
es un tipo que tiene solo un valor, que se escribe como ()
(y también significa tupla vacía sin elementos). Esto es, de hecho, algo similar a void
en C# con la excepción de que void
no tiene ningún valores.
Por cierto: El siguiente código puede parecerse a una secuencia de sentencias, pero también es una expresión:
printf "Hello "
printf "world"
El F # compilador añade implícitamente ;
entre las dos líneas y ;
es un operador de secuenciación, que tiene la siguiente estructura: <expr>; <expr>
. Requiere que la primera expresión devuelva unit
y devuelva el resultado de la segunda expresión.
Esto es un poco sorprendente cuando vienes del fondo C#, pero hace que el lenguaje sea sorprendentemente elegante y conciso. Que no lo limita de ninguna manera - puede por ejemplo escribir:
if (a < 10 && (printfn "demo"; true)) then // ...
(Este ejemplo no es realmente útil - sólo una demostración de la flexibilidad)
Donde "()" es el valor de tipo "unidad", y "unidad" es el tipo de retorno de "printfn", algo parecido a "vacío". – Brian
Perfecto, gracias! –
¿Puedo usarlo para el ciclo Empty While? – fahadash